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?
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.
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.
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
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.
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
Dies ist ein Fehler bei der Verwendung der Widgets:
problemumgehung: Verwenden von Django-Zeit Datums-Widgets in benutzerdefinierter Form
oder Ticket 12303