无法使用函数从一个视图访问另一个视图的变量?

Posted

技术标签:

【中文标题】无法使用函数从一个视图访问另一个视图的变量?【英文标题】:Unable to access a variable from one view to another view using functions? 【发布时间】:2016-05-13 15:51:45 【问题描述】:

我在 Django 中编写了一个注册表单。我正在尝试将成功注册的用户的名称从 view1 (register_user) 传递给 view2 (register_success)。这样用户就可以在注册成功页面看到自己的名字了。 以下是 2 个视图

查看1

def register_user(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
#Function for retrieving username from the form
            def give_username():
                return form.cleaned_data.get["username"]
            return HttpResponseRedirect('/accounts/register_success')

        else:
             form = UserCreationForm()
    args = 
    args.update(csrf(request))
    args['form'] = UserCreationForm()
    return render(request,'register.html',args)

视图2

def register_success(request):
    full_name = register_user(request).give_username
    return render (request,'register_success.html','full_name':full_name)

register_success.html

% extends "base.html" %
% block content %
           <h2>Hey  full_name , Greetings .. You have registered successfully !</h2>
           <p>Click <a href="/accounts/login/">here</a> to login again</p>
% endblock %

我没有使用会话来存储变量,因为这可能是一种不好的做法。 所以在尝试上面的代码时,我得到了这个错误。

AttributeError at /accounts/register_success/
'HttpResponse' object has no attribute 'give_username'
Request Method:     GET
Request URL:    http://127.0.0.1:8000/accounts/register_success/
Django Version:     1.9.2
Exception Type:     AttributeError
Exception Value: 

'HttpResponse' object has no attribute 'give_username'
Exception Location:     /home/harish/django/django/django_test/django_test/views.py in register_success, line 56
Python Executable:  /home/harish/django/django/bin/python
Python Version:     2.7.6
Python Path:    

['/home/harish/django/django/django_test',
 '/home/harish/django/django/local/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg',
 '/home/harish/django/django/lib/python2.7/site-packages/Django-1.9.2-py2.7.egg',
  '/home/harish/django/django/lib/python2.7']
Server time:    Thu, 4 Feb 2016 05:44:16 +0000

我在访问用户名变量时哪里出错了?

【问题讨论】:

你的一般方法有点偏离。如果您正在编写注册成功视图,它不会从注册表单提交视图中获取表单数据。这不是网络的工作方式。我将通过从成功视图上的请求中获取用户来处理这个问题,假设您使用的是通常的 Django 用户包的某个版本——这是一个很好的用于识别哪个用户正在发出给定请求的路径。 docs.djangoproject.com/en/1.9/ref/request-response/…了解详情。 @Peter DeGlopper 明白了,先生。所以我尝试在 success_register 视图中使用 request.user.username 并且无法检索用户名。不知道我哪里错了。 【参考方案1】:

您不能通过从外部视图调用视图来访问任意变量。您可以将数据作为 URL 参数或消息传递。

通过使用 URL 参数:

def registration(request):
    do_registration()
    return redirect(reverse('registration_success') + '?u=%s' % get_username)

def registration_success(request):
    username = request.GET.get('u', None)
    return render(request, 'my_template', 'username': username)

或通过消息:

from django.contrib.messages import get_messages

def my_view(request):
    # Process your form data from the POST, or whatever you need to do

    # Add the messages, as mentioned above
    messages.add_message(request, messages.INFO, form.cleaned_data['name'])

    return HttpResponseRedirect('/other_view_url/')

def other_view(request):
    storage = get_messages(request)
    name = None
    for message in storage:
        name = message
        break
    return render(request, 'general/other_view.html', 'name': name)

第二个 sn-p 取自 this answer。

【讨论】:

实现了您的方式,并且现在运行良好。赞一个。

以上是关于无法使用函数从一个视图访问另一个视图的变量?的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 无法访问另一个控制器中的会话数据

无法从另一个函数(在全局范围内定义)访问变量(数组)

Rails Mailer - 无法从 Mailer 视图访问实例变量

使WKWebView在后台保持不变,同时显示另一个视图

当用户从照片库中选择图像时如何显示另一个视图

无法使用按钮从一个视图控制器导航到另一个视图控制器