Django TextField 始终是必需的,尽管 blank=True,Null=True

Posted

技术标签:

【中文标题】Django TextField 始终是必需的,尽管 blank=True,Null=True【英文标题】:Django TextField always is required, despite blank=True,Null=True 【发布时间】:2015-07-09 11:20:39 【问题描述】:

尽管我有最良好的祝愿,但我似乎总是需要一个字段,但我遇到了麻烦。我的“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 在表单中,该字段称为“key_word”,但在模型中称为“word_serach”。为什么? @onyeka 是的,我已经改变了这个。问题依然存在。 @karthikr 我已经完成了迁移,更改反映在我的迁移文件中 【参考方案1】:

尝试从字段属性中完全删除所需的属性。 Required="True/False" 无效。如果要禁用它,则必须将其完全删除,per the W3C Specs 和 this article。

【讨论】:

或者可能将其设置为required="required",因为这是按照链接执行此操作的另一种方式?【参考方案2】:

试试这个:

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 并作为属性。删除引号并将其放在小部件的属性之前。

看看这是否有效。

【讨论】:

很高兴听到这个消息。祝你好运!【参考方案3】:

试试这个方法。

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

我还注意到key_word 不在您的模型字段中!

【讨论】:

感谢@Othman 的回复!我试过你所说的,问题仍然存在。我添加了正在显示的图像

以上是关于Django TextField 始终是必需的,尽管 blank=True,Null=True的主要内容,如果未能解决你的问题,请参考以下文章

Django CharField 不默认为空字符串

07_django数据模型(model)字段

Django模型TextField不呈现

Django 固定装置:通过 JSON 将 HTML 数据导入 TextField

Django如何将TextField的前10个字符作为字符串?

Django:在保存之前更改 TextField