wake-up-neo.net

Erforderliches Django-Feld in Modellform

Ich habe ein Formular, in dem ein paar Felder nach Bedarf erscheinen, wenn ich sie auch nicht möchte. Hier ist das Formular von models.py

class CircuitForm(ModelForm):
    class Meta:
        model = Circuit
        exclude = ('lastPaged',)
    def __init__(self, *args, **kwargs):
        super(CircuitForm, self).__init__(*args, **kwargs)
        self.fields['begin'].widget = widgets.AdminSplitDateTime()
        self.fields['end'].widget = widgets.AdminSplitDateTime()

Im tatsächlichen Schaltungsmodell werden die Felder wie folgt definiert:

begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)

Meine Ansichten dazu gibt es hier:

def addCircuitForm(request):
    if request.method == 'POST':
        form = CircuitForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/sla/all')
    form = CircuitForm()    
    return render_to_response('sla/add.html', {'form': form})

Was kann ich tun, damit die beiden Felder nicht benötigt werden?

70
Ryan

Wenn Sie keine leeren Einstellungen für Ihre Felder in Modellen ändern möchten (da dadurch die normale Überprüfung in der Administrationssite durchbrochen wird), können Sie in Ihrer Form-Klasse Folgendes tun:

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)

    for key in self.fields:
        self.fields[key].required = False 

Der neu definierte Konstruktor beeinträchtigt die Funktionalität nicht.

111
DataGreed

Wenn das Modellfeld leer = True ist, wird für das Formularfeld der Wert Erforderlich festgelegt. Ansonsten erforderlich = True

Sagt dies hier: http://docs.djangoproject.com/de/dev/topics/forms/modelforms/

Sieht so aus, als würden Sie alles richtig machen. Sie könnten den Wert von self.fields['end'].required überprüfen.

17
stefanw

Um die Antwort von DataGreed zu erweitern, habe ich ein Mixin erstellt, mit dem Sie eine fields_required-Variable in der Meta-Klasse folgendermaßen angeben können:

class MyForm(RequiredFieldsMixin, ModelForm):

    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
        fields_required = ['field1']

Hier ist es:

class RequiredFieldsMixin():

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        fields_required = getattr(self.Meta, 'fields_required', None)

        if fields_required:
            for key in self.fields:
                if key not in fields_required:
                    self.fields[key].required = False
4
gitaarik

Dies ist keine Antwort, aber für alle anderen Personen, die dies über Google finden, ein weiteres Datenstück: Dies geschieht mir auf einem Modellformular mit einem DateField. Es wurde auf False gesetzt, das Modell hat "null = True, blank = True" und das Feld im Formular zeigt required = False an, wenn ich es während der clean () -Methode anschaue, aber es besagt immer noch, dass ich ein gültiges Datum brauche Format. Ich verwende kein spezielles Widget und erhalte die Meldung "Geben Sie ein gültiges Datum ein", auch wenn ich input_formats = ['% Y-% m-% d', '% m /% d /% Y', ' % m /% d /% y ',' '] im Formularfeld.

EDIT: Weiß nicht, ob es jemandem helfen wird, aber ich habe das Problem gelöst, das ich hatte. Unser Formular enthält einen Standardtext in dem Feld (in diesem Fall das Wort "bis", um anzuzeigen, dass das Feld das Enddatum ist; das Feld heißt "end_time"). Ich habe speziell nach dem Wort "to" in der clean () -Methode des Formulars gesucht (ich hatte auch die clean_end_time () -Methode ausprobiert, es wurde jedoch nie aufgerufen) und setzte den Wert der clean_data -Variable auf None, wie in vorgeschlagen. dieses Django-Ticket . Nichts von alledem war jedoch von Belang, da die Validierung des Modells (glaube ich) bereits an das ungültige Datumsformat von "to" geknüpft war, ohne mir die Möglichkeit zu geben, es abzufangen. 

3
Tom

Aus der Modell-Felddokumentation ,

Wenn Sie ein Modell wie unten gezeigt haben,

class Article(models.Model):
    headline = models.CharField(
        max_length=200,
        null=True,
        blank=True,
        help_text='Use puns liberally',
    )
    content = models.TextField()

Sie können die Formularvalidierung der Überschrift in required=True ändern, anstatt blank=False als Modell des Modells.

class ArticleForm(ModelForm):
    headline = MyFormField(
        max_length=200,
        required=False,
        help_text='Use puns liberally',
    )

    class Meta:
        model = Article
        fields = ['headline', 'content']

So beantwortete die Frage,

class CircuitForm(ModelForm):
    begin = forms.DateTimeField(required=False)
    end = forms.DateTimeField(required=False)
        class Meta:
            model = Circuit
            exclude = ('lastPaged',)

dies macht begin und end zu required=False 

0

Dies ist ein Fehler bei der Verwendung der Widgets:

problemumgehung: Verwenden von Django-Zeit Datums-Widgets in benutzerdefinierter Form

oder Ticket 12303

0
Samuel Adam