Seite 1 von 1
[django]: model <-> form meta, dry?
Verfasst: Freitag 6. März 2009, 11:34
von jens
Man kann im django model einige meta Angaben, wie help_text, verbose_name usw. angeben. Wenn man forms.ModelForm verwendet werde die auch übernommen.
Um in der ModelForm zusätzliche html Attribute einzufügen, kann man das, etwas umständlich machen, ohne die Meta Angaben aus dem Model zu verlieren, siehe:
http://www.python-forum.de/post-105901.html#105901
Nun möchte ich aber in der ModelForm ein widget ändern. Wie kann ich das machen, ohne das Feld komplett neu zu definieren und damit z.B. help_text ein zweites mal einfügen, was nicht DRY ist?
Verfasst: Samstag 7. März 2009, 11:14
von sma
Ein Form definiert `__getitem__`, um ein Field gewrappt als BoundField zurückzugeben. Das wiederum hat ein Property `field`, um das Field zurückzugeben und das ein Property `widget`. Da könntest du eine eigene Widget-Instanz zuweisen.
Stefan
Verfasst: Samstag 7. März 2009, 16:48
von apollo13
Code: Alles auswählen
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
field = self.Meta.model._meta.get_field('my_field')
self.fields['my_field'] = field.formfield(my_args......)
Für formfield siehe hier:
http://code.djangoproject.com/browser/d ... __.py#L312 kwargs werden direkt dem Fieldkonstruktor übergeben. Ich muss zugeben, dass es nicht die sauberste Lösung ist, aber was solls; vlt sollte man das mal auf Django dev anregen...
Verfasst: Sonntag 8. März 2009, 18:56
von jens
Interessant, muß ich bei Gelegenheit mal testen.
Sauber ist das hinzufügen von html Attributen auch nicht wirklich, siehe:
http://www.python-forum.de/post-105901.html#105901
Wundert mich allerdings alles ein wenig, weil django ja immer so auf DRY pocht und forms ja schon die zweite Entwicklung davon ist (forms/newforms)...
Verfasst: Dienstag 17. März 2009, 12:41
von jens
Hier ein Beispiel wie ich das gerade mache:
Code: Alles auswählen
class Anmeldung(models.Model):
...
anzahl = models.PositiveIntegerField()
...
class AnmeldungForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AnmeldungForm, self).__init__(*args, **kwargs)
# Change field meta data in a DRY way
self.fields['anzahl'].min_value = 1
self.fields['anzahl'].max_value = 30
class Meta:
model = Anmeldung
Mit leuchtet nicht ganz ein, warum man min und max nicht direkt im Model angeben kann. OK, es wird wohl keine Datenbank sowas unterstützen. Aber wäre doch egal.
EDIT: Hab es mal hier hin gepackt:
http://www.djangosnippets.org/snippets/1375/
EDIT2: Das richtige Stichwort zum Thema ist "Model validation". Das wurde als neues Feature in django 1.1 geplant, aber nach django 1.2 verschoben, siehe:
http://groups.google.com/group/django-d ... 616feb229b