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?
[django]: model <-> form meta, dry?
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
Stefan
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......)
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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)...
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)...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hier ein Beispiel wie ich das gerade mache:
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
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
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