2014-01-25 168 views
0

我有一个调查问卷,有一个响应模型,我想链接到一个现有的用户。她应该能够在个人资料页面上查看她过去对调查的回复。那么,无论如何,这是计划。但我甚至无法将用户连接到响应。将user_id保存为外键

(django的== 1.5,Django的lazysignup)

用户目前在为了得到链接

# 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() 
     ... 

错误响应一个ForeignKey:

IntegrityError: null value in column "user_id" violates not-null constraint 

的场user_id包含在表格响应中。由于南模式迁移,我不得不设置一次性值并选择一个现有的user_id。

有什么想法?

+0

是否创建了懒惰的用户?什么是'response.form = save()'?我认为它应该是'response.save()' – sneawo

+0

是的,你是对的:它是'response.save()'。我编辑它。是的,懒惰的用户被创建。 –

回答

0

它的工作原理采用null=True, blank=True

class Response(models.Model): 
    survey = models.ForeignKey(Survey) 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 
1

你的代码看起来不错。我要做的第一件事是在保存之前检查用户对象。 print type(request.user), request.user。你也可以检查你的Response模型对象,确保它是你期望的。这将表明您是否需要检查表单代码或装饰器。

我不确定您为南迁移“设置一次性值”的含义。南与此无关。你是否在谈论一个用固定的user_id进行破解以获取表单来保存?那是不对的。

正如您在自己的答案中所述,在用户FK字段上设置null=True, blank=True将起作用,但实际上这意味着响应可以从“无人”提交。这样做好像修复症状。

您使用的是django-lazysignup(“django-lazyuser”看起来不是什么东西)?这是一个潜在的陷阱。简而言之,该软件包创建的临时用户可以访问convert/ URL来选择用户名和密码以成为正式用户。因为不是每个人都会这样做,所以有一个管理命令来清除未转换的懒惰用户。该命令将删除LazyUser模型对象真实的User模型对象。默认情况下,Django会级联删除相关对象,例如你的Response对象。为防止响应在与未转移的懒惰用户关联时被悄悄删除,请在ForeignKey上设置级联属性(docs)。就像user = models.ForeignKey(User, on_delete=models.PROTECT)一样,并确保ProtectedError安全处理。这只在你使用清理管理命令时很重要,但比对不起更安全,维护代码的下一个人可能会运行清理,因为谁不喜欢清理。

+0

+1为您的答案。是的,我正在使用django-lazysignup。我在我的问题中解决了它。你对清理程序是正确的。我没有想到这一点。我需要创建自己的调查应用程序,作为我的学士论文的基础。我的教授表示,如果用户能够注册以查看过去的投票选择(该调查涉及信息安全),那将会很不错。现在我必须做出以下选择:(i)在您可以投票或(ii)每个人都可以投票之前有一个登录要求。登录要求用户注册她可能懒惰做的事。因此,lazysignup能够在投票后保留答案。 –

+0

在没有创建帐户的开销的情况下进行调查可能是有意义的。您可以评估您的受众群体,但创建帐户是一个很大的障碍。只要清理不会删除数据,也许只需要lazyuser信息和响应日期即可。聪明地使用LazySignUp!提交调查问卷后,您可以随时提供“谢谢,添加用户名和密码以查看您的过去答案”页面。很好的功能。 – JCotton

+0

谢谢J.我现在要保持lazysignup。我将检查是否可以禁用清理例程并将其记录在源代码中。 –