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

Ответ 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