我有一个调查应用程序 - 您创建一个调查并保存响应。它已在Django Admin中注册。我可以看到调查并提交回复。当我在管理员中点击响应时,我收到以下错误:
/ admin / django_survey / response /的ValueError 无法查询“响应5f895af5999c49929a522316a5108aa0”:必须是“用户”实例。
所以我检查了SQL数据库,django_survey_response
我可以看到有响应,但列user_id
是NULL
。
我怀疑我的 Views 和/或 Forms 存在问题,我没有保存登录用户的详细信息,所以我试图解决这个问题
然而,现在我得到了
/ survey / 1 /
中的NameError全局名称'user'未定义
我该如何解决这个问题?我希望表单使用登录用户的ID保存响应。
追溯:
django_survey \ views.py
def SurveyDetail(request, id):
survey = Survey.objects.get(id=id)
category_items = Category.objects.filter(survey=survey)
categories = [c.name for c in category_items]
print 'categories for this survey:'
print categories
if request.method == 'POST':
form = ResponseForm(request.POST, survey=survey) <.........................
if form.is_valid():
response = form.save()
return HttpResponseRedirect("/confirm/%s" % response.interview_uuid)
else:
form = ResponseForm(survey=survey)
print form
django_survey \ forms.py
def __init__(self, *args, **kwargs):
# expects a survey object to be passed in initially
survey = kwargs.pop('survey')
self.survey = survey
self.user = user <.........................
super(ResponseForm, self).__init__(*args, **kwargs)
self.uuid = random_uuid = uuid.uuid4().hex
# add a field for each survey question, corresponding to the question
# type as appropriate.
data = kwargs.get('data')
可能值得注意的是,之前的模型字段被称为user
,而不是interviewee
。我改变了这个并再次运行迁移。
我也在使用 userena 。
答案 0 :(得分:2)
此实例中的错误消息是python试图告诉您您正在尝试访问尚未在方法范围内定义的变量user
。
让我们看一下__init__()
方法的前几行:
def __init__(self, *args, **kwargs):
# expects a survey object to be passed in initially
survey = kwargs.pop('survey')
self.survey = survey
self.user = user
我们可以看到survey
变量的定义位置:survey = kwargs.pop('survey')
。它作为关键字参数传递到表单中,并以__init__
形式提取。但是在下面你试图用user
做同样的事情,但实际上并没有在上面定义它。正确的代码如下:
def __init__(self, *args, **kwargs):
# expects a survey object to be passed in initially
survey = kwargs.pop('survey')
user = kwargs.pop('user')
self.survey = survey
self.user = user
但是,由于我们没有通过kwargs将user
变量传递给表单,所以仍然无法正常工作。为此,我们在views.py
初始化表单时将其传递给我们。什么不清楚你希望传递的用户对象是什么。request.user
?或者Survey
对象是否具有用户属性?在这种情况下,您不需要传递用户,只会使用survey.user
等。
django_survey \ views.py
def SurveyDetail(request, id):
survey = Survey.objects.get(id=id)
category_items = Category.objects.filter(survey=survey)
categories = [c.name for c in category_items]
print 'categories for this survey:'
print categories
if request.method == 'POST':
form = ResponseForm(request.POST, survey=survey, user=request.user)
if form.is_valid():
response = form.save()
return HttpResponseRedirect("/confirm/%s" % response.interview_uuid)
else:
form = ResponseForm(survey=survey, user=request.user)
print form
答案 1 :(得分:1)
在您初始化表单时,您需要将用户(在这种情况下为当前用户)传递给您?与此form = ResponseForm(request.POST, survey=survey, user=request.user)
类似。然后在表单的__init__
中弹出用户对象user = kwargs.pop('user')
。我相信这将解决您的问题。