Обязательное поле в 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