2

我正在关注Beginning Django E-Commerce,但我发现关于用户配置文件的部分有点令人困惑。基本上,我有一个像这样的抽象类:

class BaseOrderInfo(models.Model):
  class Meta:
    abstract = True
    # a bunch of fields follow
    shipping_name = models.CharField()
    # etc

在此之后,UserProfile 类继承 BaseOrderInfo:

class UserProfile(BaseOrderInfo):
  user = models.ForeignKey(User, unique = True)
  # Possibly other methods or fields here

最后,有一种检索方法,顾名思义,它检索用户配置文件(如果此用户配置文件不存在,它会为该用户对象创建一个):

def retrieve(request):
  try:
    profile = request.user.get_profile()
  except UserProfile.DoesNotExist:
    profile = UserProfile(user=request.user)
    profile.save()
  return profile

好吧,我的问题如下:考虑到 UserProfile 从 BaseOrderInfo 类继承了相当多的其他字段这一事实,如何仅通过添加一个 User 实例将这个 UserProfile 实例保存在检索方法中?据我所知,Model 和 ModelForm 默认创建必填字段。

谢谢

4

2 回答 2

1

如果UserProfile有任何必填字段,您需要先向用户提供一个表单以收集该数据。您可以将其集成到您的注册表单中,或者在您需要访问用户个人资料数据但确定该个人资料尚不存在时,只需提供一个单独的个人资料表格。

于 2011-11-01T19:17:06.217 回答
1

保存表单时,Django 不会验证模型。(请参阅有关验证对象的文档)。如果您profile.full_clean()在保存之前显式调用,那么您将看到验证错误。

如果未指定所需的外键,那么您将获得一个 database IntegrityError。其他必填字段由 Django 验证,而不是数据库。如果 Django 不验证模型,则将空字符串保存到CharField数据库中的 a 不会有任何错误。

于 2011-11-01T19:23:05.083 回答