我是django开发的新手。我正在创建一个可能有多个B类分配给它的A类:
class A(models.Model):
name = models.CharField(max_length=200)
def __unicode__(self):
self.name
class B(models.Model):
a = models.ForeignKey(A)
name = models.CharField(max_length=200)
mydate = models.DateTimeField('party date')
当我尝试在管理页面创建一个新的“A”元素,并为其创建匹配元素B,然后save()
时,我收到警告:
字段'mydate'没有默认值
如果我将“mydate”元素移动到A类,那么当点击save()
我收到来自Django的消息此字段是时,需要我填写该字段!
如果日期字段是B的一部分,我怎么能显示这个必需的消息呢
由于
答案 0 :(得分:12)
如果您未指定,您的字段是可选字段,则每次创建对象时都必须为其提供值。在你的情况下,你不能这样做,你必须做其中一件事:
以下是如何使字段可选:
class B(models.Model):
a = models.ForeignKey(A)
name = models.CharField(max_length=200)
mydate = models.DateTimeField('party date', blank=True, null=True)
以下是设置默认值的方法:
import datetime
class B(models.Model):
a = models.ForeignKey(A)
name = models.CharField(max_length=200)
mydate = models.DateTimeField('party date', default=datetime.datetime.now)
答案 1 :(得分:4)
Django中有一个实用功能
from django.utils import timezone
class B(models.Model):
a = models.ForeignKey(A)
name = models.CharField(max_length=200)
mydate = models.DateTimeField('party date', default=timezone.now)
此函数将根据settings.py
中的USE_TZ返回日期时间对象def now():
"""
Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
答案 2 :(得分:0)
根据我的理解,django将尝试验证模型A,然后返回验证错误。由于A验证,它会尝试写A失败,因为B没有验证。我不确定如何优雅地执行此操作,但如果您在验证A之前尝试自行评估表单B,则会收到“此字段为必填”消息,然后您可以向用户显示该消息。