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

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

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?

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

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

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
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:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten