我正在关注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
最后,有一个检索方法,顾名思义,检索用户配置文件(如果此用户配置文件不存在,则为该User对象创建一个):
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实例在retrieve方法中的可能性如何?据我所知,Model和ModelForm默认创建必填字段。
由于
答案 0 :(得分:1)
如果UserProfile
包含任何必填字段,则需要向用户提供表单以首先收集该数据。您可以将其集成到您的注册表单中,或者只需在需要访问用户配置文件数据时提供单独的配置文件表单,但确定该配置文件尚不存在。
答案 1 :(得分:1)
Django在保存表单时不验证模型。 (参见Validating Objects上的文档)。如果您在保存之前明确地呼叫profile.full_clean()
,那么您将看到验证错误。
如果未指定所需的外键,则会获得数据库IntegrityError
。其他必填字段由Django验证,而不是数据库。如果Django没有验证模型,那么将空字符串保存到数据库中的CharField
就不会有任何错误。