4 Stimmen

Model Formsets und Datumsfelder

Ich habe ein Model Formset auf einem Model mit einigen Datumsfeldern - die wiederum ein DateTimeField im Model sind. Aber wenn es im Template angezeigt wird, wird es als Textfeld angezeigt. Wie kann ich es als Dropdown-Menü anzeigen?

WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[], extra=3) 

So initialisiere ich das modelformset.

Wie kann ich diese Einstellungen überschreiben?

6voto

Jarret Hardie Punkte 89900

Der übliche Weg, dies zu tun, besteht darin, die Standardfeldtypen zu überschreiben in Ihrer ModelForm-Definition.

Das folgende Beispiel würde funktionieren, wenn Sie ein DateField in Ihrem Modell hätten (Ich merke, dass Sie ein DateTimeField haben... dazu komme ich gleich). Sie werden den genauen gleichen Feldtyp angeben, der normalerweise angegeben würde, aber Sie werden ein anderes Widget an den Formularfeld-Konstruktor übergeben.

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

Soweit mir bekannt ist, wird in Django 1.0.x kein entsprechendes Widget für das DateTimeField bereitgestellt. In diesem Fall sollten Sie ein benutzerdefiniertes Widget erstellen, möglicherweise durch Ableitung von SelectDateWidget. Ich sehe aus einem schnellen Google zu SelectDateTimeWidget, dass es einige andere gibt, die das Widget zu sein scheinen, das Sie suchen. Ich habe sie nicht verwendet, also caveat emptor, aber etwas wie dieser SelectDateTimeWidget-Patch könnte ein guter Ausgangspunkt sein.


Bearbeiten: Bei Verwendung eines ModelFormset oder InlineModelFormset können Sie dies immer noch erreichen, indem Sie form=MyModelForm an die inlineformet_factory-Funktion übergeben:

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

Dies funktioniert, weil die beiden ModelFormset-Fabriken tatsächlich den regulären formset_factory-Konstruktor in ihren eigenen Implementierungen aufrufen. Es ist ein wenig schwer herauszufinden, da es in der Dokumentation nicht explizit angegeben ist... vielmehr lassen die Django-Dokumentationen diese Fähigkeit vermuten, indem sie erwähnen, dass die ModelFormset-Fabriken den normalen formset_factory erweitern. Wenn ich mir unsicher bin, öffne ich django/forms/models.py, um die vollständige Signatur der Formset-Fabrikfunktionen zu überprüfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X