2009-05-18 14 views
3

Ich habe ein Model Formset auf einem Modell mit ein paar Datumsfeldern - das ist wieder ein DateTimeField im Modell. Aber wenn es in der Vorlage angezeigt wird, wird es als ein Textfeld angezeigt. Wie kann ich es als Dropdown-Box anzeigen?Model Formsets und Datumsfelder

WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3) 

So initialisiere ich das Modelformset.

Wie überschreiben ich diese Einstellungen

Antwort

6

Der übliche Weg, dies zu override the default field types in Ihrer Modelform Definition zu tun ist.

Das folgende Beispiel würde funktionieren, wenn Sie ein DateField in Ihrem Modell hätten (ich nehme zur Kenntnis, dass Sie ein DateTimeField haben ... Ich komme darauf in einer Sekunde zurück). Sie geben genau denselben Feldtyp an, der normalerweise angegeben wird, aber Sie übergeben ein anderes Widget an den Formularfeldkonstruktor.

from django.db import models 
from django import forms 
from django.forms.extras import SelectDateWidget 

class MyModel(models.Model): 
    a_date_field = models.DateField() 

class MyModelForm(forms.ModelForm): 
    a_date_field = forms.DateField(widget=SelectDateWidget()) 

    class Meta: 
     model = MyModel 

Es ist nicht, meines Wissens, ein äquivalentes Widget für die DateTimeField in Django 1.0.x. bereitgestellt In diesem Fall sollten Sie ein benutzerdefiniertes Widget erstellen, möglicherweise mit der Unterklasse SelectDateWidget. Ich bemerke von einem schnellen Google auf SelectDateTimeWidget, dass es einige andere gab, die das gemacht haben, was das Widget zu sein scheint, das du suchst. Ich habe sie nicht benutzt, also ahnungslos, aber etwas wie this SelectDateTimeWidget patch könnte ein guter Anfang sein.


Edit: Wenn ein ModelFormset oder InlineModelFormset verwenden, können Sie immer noch dies erreichen, indem form=MyModelForm zur inlineformet_factory Funktion übergeben:

MyModelFormset = inlineformset_factory(MyParentModel, MyModel, form=MyModelForm) 

Das funktioniert, weil die beiden Modelle formset Fabriken nennen tatsächlich den regulären formset_factory Konstruktor in ihren eigenen Implementierungen. Es ist ein bisschen schwer herauszufinden, weil es nicht explizit in den Dokumenten steht ... eher verweisen die Django-Dokumente auf diese Fähigkeit, indem sie beiläufig erwähnen, dass die Model-Formset-Factories das normale formset_factory erweitern. Wenn ich Zweifel habe, öffne ich django/forms/models.py, um die vollständige Signatur der Formset-Factory-Funktionen auszuchecken.

+0

Danke für die Antwort, Allerdings vergaß ich zu erwähnen, dass ich inlineformset das Formular initialisieren. Ich habe die Frage auch bearbeitet. – crashekar

+0

Keine Sorge ... Ich habe die Antwort aktualisiert. –

+0

Gute Antwort. Aber ... "verboten" bedeutet "verboten" - das glaube ich nicht. Vielleicht ist "vorgeschrieben" näher an der Bedeutung, nach der Sie suchen. –

Verwandte Themen