[django]: model <-> form meta, dry?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

[django]: model <-> form meta, dry?

Beitragvon jens » Freitag 6. März 2009, 11:34

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Samstag 7. März 2009, 11:14

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
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Beitragvon apollo13 » Samstag 7. März 2009, 16:48

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...
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Sonntag 8. März 2009, 18:56

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)...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 17. März 2009, 12:41

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder