Джанго обязательное поле в виде модели - PullRequest
71 голосов
/ 16 июля 2009

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

111 голосов
/ 16 сентября 2009

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

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

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

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

17 голосов
/ 16 июля 2009

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

Говорит вот так: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

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

4 голосов
/ 14 января 2016

Расширяя ответ 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
3 голосов
/ 30 октября 2009

Это не ответ, но для любого другого, кто найдет это через Google, еще один бит данных: это происходит со мной в модельной форме с DateField. Требуется установить значение False, модель имеет значение «null = True, blank = True», а поле в форме показывает значение required = False, если я смотрю на него во время метода clean (), но все равно говорится, что мне нужна правильная дата формат. Я не использую какой-либо специальный виджет, и я получаю сообщение «Введите правильную дату», даже если я явно установил input_formats = ['% Y-% m-% d', '% m /% d /% Y', ' % m /% d /% y ',' '] в поле формы.

РЕДАКТИРОВАТЬ: Не знаю, поможет ли это кому-нибудь еще, но я решил проблему, с которой столкнулся. Наша форма имеет некоторый текст по умолчанию в поле (в этом случае слово «to» для обозначения поля является датой окончания; поле называется «end_time»). Я специально искал слово «to» в методе clean () формы (я также пробовал метод clean_end_time (), но он никогда не вызывался) и устанавливал значение переменной clean_data в None, как предложено в этот билет Джанго . Тем не менее, ничего из этого не имело значения, поскольку (я полагаю) проверка модели уже вырвала недопустимый формат даты «до», не давая мне возможности перехватить ее.

0 голосов
/ 15 февраля 2017

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

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

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 голосов
/ 02 декабря 2009

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

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

или билет 12303

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...