无法使用函数从一个视图访问变量到另一个视图?
Unable to access a variable from one view to another view using functions?
我用 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
访问用户名变量哪里出错了?
您不能通过从外部视图调用视图来访问任意变量。您可以将数据作为 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})
摘自 this answer 的第二个片段。
我用 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
访问用户名变量哪里出错了?
您不能通过从外部视图调用视图来访问任意变量。您可以将数据作为 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})
摘自 this answer 的第二个片段。