2016-09-07 2 views
0

У меня проблема, когда мой ModelForm пытается присвоить поле поле (это экономит штраф, если я действительно предоставляю первичный ключ Product, но это не обязательное поле и не будет сохранено, если поле осталось пустым). Я считать, что ОРМ он пытается установить это поле в '' но:ModelForm не будет проверять, поскольку отсутствует значение, но поле модели имеет значение null = True

  • не '' должны быть принуждены к None, и;
  • Почему модель не пытается установить это поле на None в первую очередь вместо ''?

models.py

class Question(models.model): 
    fk_product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True, related_name="product_question") 

forms.py

class QuestionForm(forms.ModelForm): 
    fk_product=forms.ChoiceField(required=False) 
    class Meta: 
     model = Question 
     fields = ['fk_product',] 

Ошибка:

Cannot assign "''": "Question.fk_product" must be a "Product" instance.

Код вид, который производит ошибку:

QuestionModelFormset = modelformset_factory(Question, 
           form=QuestionForm, 
           extra=1) 
    question_formset = QuestionModelFormset(
          data=request.POST, 
          files=request.FILES, 
          queryset=Question.objects.all()) 
    if not question_formset.is_valid(): #error occurs on this line 
+0

Вы не должны использовать 'ChoiceField' для внешнего ключа. Используйте «ModelChoiceField». Если вы установили 'blank = True' в модели, как предлагает @ 4140tm, то форма будет использовать' ModelChoiceField' с 'required = False', поэтому вы можете удалить строку' 'fk_product = forms.ChoiceField (required = False) 'из вашей формы. – Alasdair

ответ

4

Попробуйте добавить blank=True.

null=True означает, что этому полю разрешено NULL в базе данных.

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

+0

Вы правы; Я должен быть там. Однако обновление и миграция не устраняют ошибку проверки. – Escher

+0

Попробуйте очистить кеш, и если это не решит его, перезапустите сервер. Не обязательно, но кто знает. Когда у меня были подобные ошибки, достаточно простого обновления страницы. – 4140tm

+0

Ах, простите, проигнорируйте этот комментарий; У меня была старая ошибочная запись в моей базе данных, которая не подтвердила бы. Работает после удаления. – Escher

Смежные вопросы