Обязательное поле в Django модели в форме
у меня есть форма, где несколько полей выходят по мере необходимости, когда я их тоже не хочу. Вот форма от 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()
в реальной модели схемы поля определяются следующим образом:
begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)
мой views.py ибо это здесь:
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})
что я могу сделать, чтобы эти два поля не были обязательными?
6 ответов
Если вы не хотите изменять пустые настройки для своих полей внутри моделей (это нарушит нормальную проверку на сайте администратора), вы можете сделать следующее в своем классе формы:
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
переопределенный конструктор не повредит никакой функциональности.
Если поле модели имеет значение blank=True, то required имеет значение False в поле формы. В противном случае required=True
говорит так здесь:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
Похоже, вы все делаете правильно.
Вы можете проверить значение self.fields['end'].required
.
Это не ответ, но для всех, кто находит это через Google, еще один бит данных: это происходит со мной в модельной форме С полем данных. Для этого требуется установить значение False, модель имеет "null=True, blank=True", а поле в форме показывает required=False, если я посмотрю на него во время метода clean (), но он все еще говорит, что мне нужен допустимый формат даты. Я не использую специальный виджет, и я получаю сообщение "Введите допустимую дату", даже если я явно установил input_formats=['%Y - %m - %d', "%m/%d/%Y", "%m/%d / %y","] в поле формы.
EDIT: не знаю, поможет ли это кому-нибудь еще, но я решил проблему, которая у меня была. Наша форма имеет некоторый текст по умолчанию в поле (в этом случае слово "to" для указания поля является датой окончания; поле называется "end_time"). Я специально искал слово " to " в методе clean() формы (я также пробовал метод clean_end_time (), но он никогда не вызывался) и устанавливал значение clean_data переменная None, как предложено в этот билет Джанго. Однако ничто из этого не имело значения, поскольку (я думаю) проверка модели уже вырвала недопустимый формат даты "to", не давая мне возможности перехватить его.
расширяя ответ DataGreed, я создал Mixin, который позволяет указать fields_required
переменной на Meta
класс такой:
class MyForm(RequiredFieldsMixin, ModelForm):
class Meta:
model = MyModel
fields = ['field1', 'field2']
fields_required = ['field1']
вот это:
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
Это ошибка при использовании виджетов:
решение: использование виджетов времени/даты Django в пользовательской форме
или билет 12303
если у вас есть модель, как показано ниже
class Article(models.Model):
headline = models.CharField(
max_length=200,
null=True,
blank=True,
help_text='Use puns liberally',
)
content = models.TextField()
вы можете изменить проверку формы заголовка на required=True
вместо blank=False
как модель, определяющая поле, как показано ниже.
class ArticleForm(ModelForm):
headline = MyFormField(
max_length=200,
required=False,
help_text='Use puns liberally',
)
class Meta:
model = Article
fields = ['headline', 'content']
так, отвечая на вопрос,
class CircuitForm(ModelForm):
begin = forms.DateTimeField(required=False)
end = forms.DateTimeField(required=False)
class Meta:
model = Circuit
exclude = ('lastPaged',)
это делает begin
и end
to required=False