Django: Feld-Labels sind nicht DRY

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo,

man nehme ein Feld für einen Vornamen:

models.py:

Code: Alles auswählen

firstname = models.CharField(max_length = 50, blank=True, verbose_name='Vorname')
forms.py:

Code: Alles auswählen

firstname = forms.CharField(max_length = 50, required=True, label='Vorname')
Das Admininterface holt sich verbose_name aus models.py.
Die Templates der Webanwendung holen sich label aus forms.py.

Also muss ich sämtliche Feldbezeichnungen doppelt schreiben. Gibt es eine Möglichkeit, dies zu verhindern?

Grüße,
Olaf

P.S.: Das Weglassen des Formelements ist keine Lösung, da ich hier (nicht im obrigen Beispielcode vorhanden) eigene Widgets und auch eigene Field-Klassen benutze.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

filchos hat geschrieben:Also muss ich sämtliche Feldbezeichnungen doppelt schreiben. Gibt es eine Möglichkeit, dies zu verhindern?
Form-Klasse aus Model-Klasse erstellen lassen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

filchos hat geschrieben:

Code: Alles auswählen

firstname = models.CharField(max_length = 50, blank=True, verbose_name='Vorname')
Abgesehen von dem was Leonidas sagte, wird die obere Zeile üblicherweise so geschrieben:

Code: Alles auswählen

firstname = models.CharField('Vorname', max_length = 50, blank=True)
Nur bei ForeignKey Fields musst du explizit verbose_name verwenden…
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Leonidas hat geschrieben:Form-Klasse aus Model-Klasse erstellen lassen?
Hm,

die Klassendefinition des Models ist:

Code: Alles auswählen

class User(models.Model):
    # […]
Die des zugehörigen Formobjekts:

Code: Alles auswählen

class UserForm(forms.ModelForm):
    # […]
    class Meta:
        model = User
was muss ich zusätzlich tun, um die Form-Klasse aus der Model-Klasse erstellen zu lassen?

Grüße,
Olaf
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

filchos hat geschrieben:was muss ich zusätzlich tun, um die Form-Klasse aus der Model-Klasse erstellen zu lassen?
Steht doch in der Dokumentation :?:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo Leonidas,

anhand dieser Dokumentation habe ich auch gearbeitet. Einziger Unterschied ist die Art, wie ich im View eine Instanz erzeuge:

Code: Alles auswählen

def edit(request):
    # […]
    # user is a single User object
    params = {'instance': user}

    if request.method == 'POST':
        form = UserForm(request.POST, **params)
    else:
        form = UserForm(**params)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und wo ist jetzt das Problem? Jetzt kannst du in deiner Form-Klasse die Felder weglassen und bist fertig; DRY wiederhergestellt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Ich habe jetzt in der Form-Klasse Felddefinitionen aus zwei Gründen:

(a) ich benutze ein bestimmtes Widget:

Code: Alles auswählen

dateofbirth = forms.DateField(widget = GermanDateWidget, label='Geburtsdatum')
(b) ich habe ein eigenes Feld, welches von RegexField erbt, aber eine feste RegEx vorgibt, da in vielen Feldern nur bestimmte Zeichen erlaubt sein sollen.

Code: Alles auswählen

firstname = SecureLineField(max_length = 50, required=True, label='Vorname')
Deswegen kommt ein reines Weglassen nicht in Frage. Es sei denn, ich kann diese Informationen auch in das Model schieben (wo die Widgets aber schon logisch nicht hingehören).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wo sich mir die Frage stellt, warum du das nicht von Anfang an gesagt hast...

Letztendlich musst du halt nur die Formfelder definieren wo du von den Standardwerten abweichst, fürs auswechseln der Widgets gibs im Abschnitt "Overriding the default field types" ein Beispiel.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Um es dann allerdings DRY zu halten würde ich das ganze in dem __init__ des Modelforms patchen, da sonst der helptext und das Label wieder verloren gehen (für die Felder die du überschreibst).
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo Leonidas,
Leonidas hat geschrieben:Wo sich mir die Frage stellt, warum du das nicht von Anfang an gesagt hast...
Das habe ich ein bisschen im P.S. meines Ausgangspostings versteckt …

Letztendlich verfahre ich auch so, wie unter „Overriding the default field types“ beschrieben. Mich wundert bloß, dass dann in der Form-Felddefinition nicht automatisch verbose_name der Modell-Felddefinition verwendet wird, sondern ich explizit label angeben muss.

Grüße,
Olaf
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

filchos hat geschrieben: Letztendlich verfahre ich auch so, wie unter „Overriding the default field types“ beschrieben. Mich wundert bloß, dass dann in der Form-Felddefinition nicht automatisch verbose_name der Modell-Felddefinition verwendet wird, sondern ich explizit label angeben muss.
Das ist nicht verwunderlich sondern logisch, wie soll das auch gehen? Du bietest dein eigenes FormField an, natürlich wird dann dessen label verwendet… Was anderes zu erwarten würde mehr als gegen den „Zen of Python“ sein; es wäre implizit und magisch…
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo apollo13,
apollo13 hat geschrieben:Um es dann allerdings DRY zu halten würde ich das ganze in dem __init__ des Modelforms patchen […]
hast Du ein kurzes Codebeispiel für mich oder ein Tipp, wo dokumentiert ist, wie ich in __init__ die Felder ändern kann, anstatt sie neu zu setzen?

Grüße,
Olaf
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Das ist zwar nimmer 100% aktuell, aber beschreibt es recht gut denk ich: http://wadofstuff.blogspot.com/2009/02/ ... s-and.html
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
filchos
User
Beiträge: 35
Registriert: Dienstag 2. Juni 2009, 10:48
Wohnort: München
Kontaktdaten:

Hallo jens, hallo apollo13,

vielen Dank für die die interessanten Links. Die nächsten Tage ist noch anderes dran, dann werde ich mich der Sache wieder widmen.

Danke und Grüße,
Olaf
Antworten