it-swarm.com.ru

Джанго обязательное поле в виде модели

У меня есть форма, где пара полей выходит по мере необходимости, когда я тоже не хочу их. Вот форма из 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})

Что я могу сделать, чтобы два поля не были обязательными?

70
Ryan

Если вы не хотите изменять пустые настройки для ваших полей внутри моделей (это нарушит обычную проверку на сайте администратора), вы можете сделать следующее в своем классе Form:

def __init__(self, *args, **kwargs):
    super(CircuitForm, self).__init__(*args, **kwargs)

    for key in self.fields:
        self.fields[key].required = False 

Переопределенный конструктор не повредит никакой функциональности.

111
DataGreed

Если поле модели имеет пустое значение = True, то для поля формы требуется значение False. В противном случае требуется = True

Так говорит здесь: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Похоже, вы все делаете правильно .. Вы можете проверить значение self.fields['end'].required.

17
stefanw

Расширяя ответ 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
4
gitaarik

Это не ответ, но для любого другого, кто найдет это через Google, еще один бит данных: это происходит со мной в модельной форме с DateField. Требуется установить значение 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, как это было предложено в этот Джанго билет . Тем не менее, ничего из этого не имело значения, поскольку (я полагаю) проверка модели уже вырвала недопустимый формат даты «до», не дав мне возможности перехватить ее. 

3
Tom

Из модель полевой документации ,

Если у вас есть модель, как показано ниже,

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 

0
All Іѕ Vаиітy

Это ошибка при использовании виджетов:

временное решение: Использование виджетов времени/даты в Django в пользовательской форме

или билет 12303

0
Samuel Adam