Seite 1 von 1
[Django] ModelForm und initial dict mit ForeignKey bug?
Verfasst: Mittwoch 5. August 2009, 12:50
von jens
Einer ModelForm kann man ja ein initial={} übergeben.
Ist es normal das als value keine Model instanz erlaubt ist? Die werden ignoriert
Ich mache das deswegen in der Art:
Code: Alles auswählen
for attr_name in ("parent", "design", "showlinks", "permitViewGroup", "permitEditGroup"):
model_attr = getattr(parent_pagetree, attr_name)
if hasattr(model_attr, "pk"):
initial_data[attr_name] = model_attr.pk # XXX: A django Bug?
else:
initial_data[attr_name] = model_attr
return initial_data
Btw. direkt eine Instance übergeben geht nicht. Zum einen möchte ich nicht alle Werte vorselektieren und zum anderen setzt sich meine Form aus drei verschiedenen Models zusammen...
Lösung
Verfasst: Freitag 9. Oktober 2009, 17:18
von jakobusrex
SomeModelForm(instance=some_instance)
müsste auch mit mehreren models gehen, sofern diese mit schlüsseln verbunden sind, dann automatisch.
z.b. mein form ist mit "User" verknüpft, das feld wird problemlos gesetzt.
[list=1]
[*]In den Laden gehen
[*]Einen neuen Computer kaufen
[*]Den Computer verfluchen, wenn er nicht mehr geht
[/list]
Verfasst: Freitag 9. Oktober 2009, 17:28
von jakobusrex
irgendwie wird mein code nicht richtig angezeigt, ich poste das trotzdem mal als beispiel
model
Code: Alles auswählen
class user_annotation_image_tags(models.Model):
user = models.ForeignKey(User, unique=False)
tag = models.CharField(max_length=255)
class Meta:
db_table = 'dta2_user_annotation_image_tags'
def __unicode__(self):
return self.tag
#annotation
class user_annotation_image(models.Model):
user = models.ForeignKey(User, unique=False)
page = models.ForeignKey(page, unique=False)
link = models.CharField(max_length=255)
comment = models.CharField(max_length=255)
user_annotation_image_tags = models.ForeignKey(user_annotation_image_tags, unique=False)
class Meta:
db_table = 'dta2_user_annotation_image'
def comment_10_dotted(self):
if len(self.comment) > 10:
return self.comment[0:10] + '...'
return self.comment
def __unicode__(self):
return str(self.user)
form
Code: Alles auswählen
class AnnotationForm(forms.ModelForm):
user = forms.ModelChoiceField(queryset=User.objects.all(),
widget=forms.HiddenInput())
page = forms.ModelChoiceField(queryset=page.objects.all(),
widget=forms.HiddenInput())
link = forms.TextInput()
comment = forms.CharField(required = False, widget=forms.Textarea(attrs={'cols': 50, 'rows': 5, 'style':"width:200px;height:40px;"}))
user_annotation_image_tags = forms.CharField()
class Meta:
model = user_annotation_image
instanziieren
Code: Alles auswählen
form = AnnotationForm(instance=user_annotation_image_instanz)