Django的TextField始终是必需的,尽管设置了blank=True和Null=True。

6
我有一个困扰,一个字段似乎总是要求必填,尽管我已经尝试确保选项允许为空。我的“word_search”文本字段总是要求输入数据,但我一直在努力确保选项允许为空。
我的模型如下所示。你可以看到blank=True、Null=True选项。
class IAV(models.Model):

  z_score = models.DecimalField(max_digits = 4,decimal_places=4)
  screens = models.IntegerField(default=0)
  flu_proteins = models.IntegerField(default = 0)
  Key_word = models.TextField(blank=True,null=True)
  sess = models.ForeignKey(Sess_IAV,default=None)

我的观点是这样的

def new_IAV(request):

  if request.method == "POST":
    form = IAVForm(request.POST,request.FILES)
    if form.is_valid():
      sess_ = Sess_IAV.objects.create()
      form.save(
          for_page=sess_,
          z_score = form.cleaned_data("z_score"),
          screens = form.cleaned_data("screens"),
          flu_proteins = form.cleaned_data("flu_proteins"),
          Key_word = form.cleaned_data("key_word"),
          )
      return redirect(sess_)
    else:
      print(form.errors)
  else:
    url=reverse('IAV_home')
    return HttpResponseRedirect(url)

我的表单如下,您可以看到 required=False 属性。

class IAVForm(forms.models.ModelForm):

  z_score = forms.DecimalField(widget=forms.NumberInput(attrs={'class':'form-control','value':'0.0',}))

  screens = forms.IntegerField(widget=forms.NumberInput(attrs={'class':'form-control','value':'0',}))

  flu_proteins = forms.IntegerField(widget=forms.NumberInput(attrs={'class':'form-control','value':'0',}))

  key_word = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control','rows':1,'cols':10,'placeholder':'keword values','required':'False'}))


  class Meta:
    model=IAV
    fields=('z_score','screens','flu_proteins','key_word')

  def save(self,for_page,z_score,screens,flu_proteins,key_word):
    self.instance.sess = for_page
    self.instance.z_score = z_score
    self.instance.screens = screens
    self.instance.flu_proteins = flu_proteins
    self.instance.key_word = key_word
    return super().save()

我不确定为什么这个字段不允许留空,因为该模型具有 'blank=True, null=True' 选项。
此外,小部件显示它不是必填项。 这是显示的内容

你在迁移之后添加了 null=True 吗? - karthikr
在表单中,字段被称为“key_word”,但在模型中它被称为“word_search”。为什么呢? - onyeka
@onyeka 是的,我已经更改了这个。问题仍然存在。 - GreatGather
@karthikr 我已经完成了迁移,更改已经反映在我的迁移文件中。 - GreatGather
3个回答

4

试试这个:

class IAVForm(forms.ModelForm):
  z_score = forms.DecimalField(widget=forms.NumberInput(attrs={'class':'form-control','value':'0.0',}))
  screens = forms.IntegerField(widget=forms.NumberInput(attrs={'class':'form-control','value':'0',}))
  flu_proteins = forms.IntegerField(widget=forms.NumberInput(attrs={'class':'form-control','value':'0',}))
  key_word = forms.CharField(required=False, widget=forms.Textarea(attrs={'class':'form-control','rows':1,'cols':10,'placeholder':'keword values'}))

首先,你只需要将类变为 (forms.ModelForm)。另外,在引号内和属性中设置了required=False。请删除引号并将其放在小部件的属性之前。

看看是否有效。


很高兴听到这个消息。祝你好运! - jape

0

尝试这种方式。

  def __init__(self, *args, **kwargs):
      super(IAVForm, self).__init__(*args, **kwargs)
      self.fields["key_word"].required = False

我还注意到你的模型字段中没有key_word


感谢@Othman的回复!我尝试了您所说的方法,但问题仍然存在。我已经添加了一张截图来展示发生了什么。 - GreatGather

0

尝试从字段属性中完全删除required属性。 Required="True/False"是无效的。如果您想禁用它,您必须完全删除它,根据W3C规范本文


或者根据链接将其设置为 required="required",这是另一种方法,对吧? - DigitalDouble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接