Django 1.11:“全局名称'用户'未定义”

时间:2018-03-15 12:12:13

标签: django django-forms django-views

我有一个调查应用程序 - 您创建一个调查并保存响应。它已在Django Admin中注册。我可以看到调查并提交回复。当我在管理员中点击响应时,我收到以下错误:

  

/ admin / django_survey / response /的ValueError   无法查询“响应5f895af5999c49929a522316a5108aa0”:必须是“用户”实例。

所以我检查了SQL数据库,django_survey_response我可以看到有响应,但列user_idNULL

我怀疑我的 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

2 个答案:

答案 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')。我相信这将解决您的问题。