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 68

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. В противном случае требуется=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 переменной нет, как полагают в этот билет Джанго. Однако ничто из этого не имело значения, поскольку (я думаю) проверка модели уже блевала на недопустимый формат даты "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 до required=False