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)
My 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})
Что я могу сделать, чтобы эти два поля не требовались?
Ответы
Ответ 1
Если вы не хотите изменять пустые настройки для своих полей внутри моделей (это нарушит нормальную проверку на сайте администратора), вы можете сделать следующее в своем классе Form:
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
Пересмотренный конструктор не повредит никакой функциональности.
Ответ 2
Если поле модели имеет пустое value = Истина, то в поле формы значение False устанавливается в поле False. В противном случае, обязательно = True
Здесь говорится: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
Похоже, вы все делаете правильно.
Вы можете проверить значение self.fields['end'].required
.
Ответ 3
Это не ответ, но для всех, кто находит это через Google, еще один бит данных: это происходит со мной в модельной форме с DateField. Он потребовал установить значение False, модель имеет "null = True, blank = True", и поле в форме показывает required = False, если я смотрю на него во время метода clean(), но он все еще говорит, что мне нужна действительная дата формат. Я не использую специальный виджет, и я получаю сообщение "Ввести действительную дату", даже когда я явно устанавливаю input_formats = ['% Y-% m-% d', '% m/% d/% Y', ' % m/% d/% y ',' '] в поле формы.
РЕДАКТИРОВАТЬ: Не знаю, поможет ли это кому-либо еще, но я решил проблему, с которой я столкнулся. В нашей форме есть текст по умолчанию в поле (в этом случае слово "в", чтобы указать, что поле является конечной датой, поле называется "end_time" ). Я специально искал слово "to" в методе clean() (я также попробовал метод clean_end_time(), но он никогда не вызывался) и установил значение переменной pure_data равным None, как предлагается в этот билет Django. Тем не менее, ничто из этого не имело значения (я думаю), что проверка модели уже искала недопустимый формат даты "до", не давая мне возможности перехватить его.
Ответ 4
Развернув ответ 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
Ответ 5
Это ошибка при использовании виджетов:
обходной путь:
Использование виджетов времени/даты Django в пользовательской форме
или билет 12303
Ответ 6
Из документация по модели поля,
Если у вас есть модель, как показано ниже,
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
равным required=False