我有一个带有响应模型的调查,我想链接到现有用户。她应该能够在个人资料页面上查看她过去对调查的回复。好吧,无论如何,那是计划。但我甚至无法将用户链接到响应。
(django == 1.5,django-lazysignup)
用户当前是Response中的ForeignKey以获取链接
# models.p
from django.contrib.auth.models import User
class Response(models.Model):
survey = models.ForeignKey(Survey)
user = models.ForeignKey(User)
...
#views.py
@allow_lazy_user
def survey_detail(request, slug):
...
if form.is_valid():
response = form.save(commit=False)
response.user = request.user
response.save()
...
错误:
IntegrityError: null value in column "user_id" violates not-null constraint
字段user_id包含在表响应中。由于南模式迁移,我不得不设置一次性值并选择现有的user_id。
有什么想法吗?
答案 0 :(得分:1)
你的代码看起来不错。我要做的第一件事就是在保存之前检查User对象。 print type(request.user), request.user
。您还可以检查您的Response模型对象,以确保它符合您的期望。这表明你是否需要检查表单代码或装饰器。
我不确定你为南迁移“设置一次性价值”是什么意思。南方不会与此有任何关系。您是在谈论使用固定user_id的黑客来获取要保存的表单吗?那不对。
正如您在自己的回答中所说,在用户FK字段上设置null=True, blank=True
将起作用,但实际上这意味着可以从“无人”提交回复。这样做似乎可以解决症状。
您使用的是django-lazysignup(“django-lazyuser”似乎不是什么东西)?这是一个潜在的陷阱。简而言之,该软件包创建的临时用户可以点击convert/
URL来选择用户名和密码以成为官方用户。因为不是每个人都会这样做,所以有一个管理命令来清除未转换的懒惰用户。该命令将删除LazyUser模型对象和真实的用户模型对象。默认情况下,Django将级联删除相关对象,例如你的Response对象。要防止响应在与未关联的惰性用户关联时以静默方式删除,请在ForeignKey(docs)上设置cascade属性。像user = models.ForeignKey(User, on_delete=models.PROTECT)
之类的东西,确保安全地处理ProtectedError
。这只有在你使用清理管理命令时才有意义,但是比对不起更安全,下一个维护代码的人可能会运行清理,因为谁不喜欢清理。
答案 1 :(得分:0)
使用null=True, blank=True
class Response(models.Model):
survey = models.ForeignKey(Survey)
user = models.ForeignKey(User, null=True, blank=True)
...