Django 将用户id另存为外键

Django 将用户id另存为外键,django,django-models,django-users,Django,Django Models,Django Users,我有一个带有响应模型的调查,我喜欢将其链接到现有用户。她应该能够在个人资料页面上查看自己过去对调查的回复。好吧,反正这就是计划。但我甚至无法将用户链接到响应 (django==1.5,django lazysignup) 用户当前是一个ForeignKey响应,以便获得链接 # models.p from django.contrib.auth.models import User class Response(models.Model): survey = models.Foreign

我有一个带有响应模型的调查,我喜欢将其链接到现有用户。她应该能够在个人资料页面上查看自己过去对调查的回复。好吧,反正这就是计划。但我甚至无法将用户链接到响应

(django==1.5,django lazysignup)

用户当前是一个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
字段用户id包含在表响应中。由于south schemamigration,我必须设置一个一次性值并选择一个现有的用户id


有什么想法吗?

它使用
null=True,blank=True

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

你的代码看起来不错。我要做的第一件排除故障的事情是在保存用户对象之前检查它<代码>打印类型(request.user)、request.user。您还可以检查响应模型对象,以确保它符合您的期望。这将指示您是否需要检查表单代码或装饰程序

我不知道你说的“为南方移民设定一次性价值”是什么意思。南方与此无关。你说的是一个用固定用户id来保存表单的黑客吗?那是不对的

正如您在自己的回答中所说,在用户FK字段上设置
null=True,blank=True将起作用,但实际上这意味着可以“无人”提交响应。这样做似乎是在纠正一个症状


你在使用(“django lazyuser”似乎不是什么东西)?这里有一个潜在的陷阱。简而言之,该软件包创建了临时用户,这些临时用户可以点击
convert/
URL选择用户名和密码成为正式用户。因为不是每个人都会这样做,所以有一个管理命令来清除未转换的懒惰用户。该命令将删除LazyUser模型对象和真实用户模型对象。默认情况下,Django将级联删除相关对象,例如您的响应对象。如果响应与未转换的惰性用户关联,则要防止它们被静默删除,请在ForeignKey()上设置cascade属性。类似于
user=models.ForeignKey(用户,on_delete=models.PROTECT)
并确保安全处理
ProtectedError
。这只在您使用“清理管理”命令时才重要,但“安全总比抱歉好”,下一个维护代码的人可能会运行“清理”,因为谁不喜欢清理。

是惰性用户创建的吗?什么是
response.form=save()
?我认为应该是
response.save()
是的,你是对的:它是
response.save()
。我编辑了它。是的,懒惰用户被创建了。回答+1。是的,我用的是django lazysignup。我在问题中修正了它。关于清理程序,你是对的。我没想过。我需要创建自己的调查应用程序作为我的学士学位论文的基础。我的教授说,如果用户能够注册查看过去的投票选择,那就太好了(这项调查是关于信息安全的)。现在我必须选择:(I)投票前需要登录,或者(ii)每个人都可以投票。登录需要用户注册,这可能是她懒得做的。因此,lazysignup必须能够在投票后保留答案。允许进行调查而无需创建帐户的开销可能是有道理的。你可以评估你的受众,但创建账户是一个很大的障碍。只要cleanup不删除数据,也许有lazyuser信息和响应日期就足够了。聪明的使用懒鬼注册!提交调查后,您可以随时提供“谢谢,添加用户名和密码以查看您过去的答案”页面。很好的功能。谢谢J。我现在会继续懒散的注册。我将检查是否可以禁用清理例程并将其记录在源代码中。