【问题标题】:Django DateField not allowing nullDjango DateField 不允许为空
【发布时间】:2013-01-22 12:38:59
【问题描述】:

这似乎是一个常见问题,但此处其他问题中建议的补救措施似乎对我不起作用。

我通过 html 表单提交了一些日期,有些不是必需的,可以为空白。但是我得到了错误

[u'Enter a valid date in YYYY-MM-DD format.']

下面是我的模型文件

class ProjectM(models.Model):
    order_received = models.DateField(null=True,blank=True)

MySQL 数据库

Field                  | Type         | Null | Key | Default | Extra
order_received         | date         | YES  |     | NULL    |                

所以按照我的理解,我应该在模型文件中将它设置为 True 以表示 null 和空白,并确保在我的 mysql DB 中我允许 NULL。但是我仍然得到上面提到的验证错误,当我检查这个特定字段的 POST 数据中的值时,它是''。我尝试更改正在生成的 html 中的值以检查空字段并将值设为“null”,但这似乎也不起作用。

任何帮助将不胜感激:)

更新:@Cathy,这里是描述问题的模式代码。我省略了一些与问题完全无关的代码,并对其进行了一些简化。基本上,我正在构建一个小型数据库网络前端,它只是将记录拉出,以表格格式显示在表单中,并允许您编辑和更新记录。它会拉出一个空白的日期字段,但不会让我更新。

模板

{% for record in records %}
<form method="post" action="">
<tr>
<td><input type="submit" value="{{ record.id }}" name="submit"></td>
<td><input type="text" value="{{ record.pm }}" name="pm"></td>
<td><input type="text" value="{{ record.spec }}" name="spec"></td>
<td><input type="date" value="{{ record.order_received|date:"Y-m-d" }}" name="order_received"></td>
</tr>
</form>
{% endfor %}

型号

class ProjectM(models.Model):
    pm = models.CharField(max_length="200")
    spec = models.CharField(max_length="200")
    order_received = models.DateField(null=True,blank=True)

查看

def all(request):
    if request.method == 'POST':
        id = request.POST['submit']
        pm = request.POST['pm']
        spec = request.POST['spec']
        order_received = request.POST['order_received']
        if not order_received:
            order_received = 'None'
        update = ProjectM.objects.get(pk=int(id))
        update.pm = pm
        update.spec = spec
        update.order_received = order_received
        update.save()

更新模板代码

{% if record.order_received %}
 <td>
  <div class="styled-dateentered">
   <input class="entered" name='order_received{{ record.id }}' id="order_received{{ record.id }}" type="date" value="{{ record.order_received|date:"Y-m-d" }}">
  </div>
 </td>
{% else %}
 <td>
  <div class="styled-datenotentered">
   <input class="notentered" id="order_received{{ record.id }}" name="order_received{{ record.id }}" type="date" value="None">
  </div>
 </td>
{% endif %}

我希望这会有所帮助。非常感谢您的帮助。

谢谢

【问题讨论】:

  • 在该字段中输入“required=False”
  • 你的表单是什么样子的
  • 我的表单很基本,我们可以这样说
    ,它从数据库中提取一个日期并显示它,如果有的话。否则它会显示 dd/mm/yyyy 但值设置为 ''。如果我选择一个日期并更新它可以工作,但如果我更新并将该字段留空,我会收到错误。
  • @cathy 我没有使用 django 中的 model.forms 来创建我的表单。我在模型文件的字段选项中尝试了这个,但我猜它吐出一个错误,因为它不是真正的 mysql 字段选项。
  • 我可以看看你的完整代码吗?只需更新您的问题

标签: django forms date null models


【解决方案1】:

如果您使用ModelForm 代表此型号ProjectM,例如:

class ProjectMForm(ModelForm):
    class Meta:
        model = ProjectM

您应该没有任何问题,但请确保您在此表单中没有名为order_received 的字段,在此form 中没有required=False 参数。如果您想拥有一个具有此名称的字段,您应该这样做:order_received = forms.DateField(required=False)

【讨论】:

  • 感谢您的回复。我实际上并没有使用构建的 django 表单来创建我的表单,所以我没有 ModelForm 信息。我通过 POST 将数据传递给我的视图。当我查看回溯时,POST['order_received'] 确实是空的。它需要是值 NULL 还是只是一个空字符串?再次感谢
  • 我删除了我的数据库并与 Django 重新同步了我的数据库,但似乎仍然遇到了问题。有没有办法可以简单地关闭 Django 中的表单验证?老实说,我真的不需要它。
  • 我注意到您正在使用POST 方法,而您的表单中没有{% csrf_token %}
  • 好吧,我已经深入测试了你的代码。当None 为空时,您可以解决将order_received 字段分配给order_received 的问题。例如:update.order_received = order_received if order_received else None,因为正如您所提到的,空字符串不会被识别为Date 数据类型的有效值。
  • @Vladir 我有csrf豁免代码,因为我遇到了麻烦。我会试试你的方法,我有一种感觉,就像一个空字符串确实不是'null'或'none'。让我们看看情况如何。
猜你喜欢
  • 2013-01-19
  • 2018-12-20
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2018-01-12
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多