在 Django 中渲染无法传递参数
Render in django can't passing an argument
我是 django 的新手,我正在尝试创建一个应用程序,用户可以根据 his/her id 更改 his/her 密码。到目前为止还不错,但是当我试图从我的 views.py 传递一个参数时,有一个参数无法传递给 html 模板的问题。
这是我的看法:
def tambah_user(request, template_name='form_user.html'):
if 'username' in request.session:
username = User.objects.all()
data = {}
data['object_list'] = username
if request.method == 'POST':
user_form = UserForm(data=request.POST)
profile_form = UserProfileForm(data=request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
return redirect('manajemen_user')
else:
print user_form.errors, profile_form.errors
else:
user_form = UserForm()
profile_form = UserProfileForm()
return render(request, template_name,
{'user_form': user_form, 'profile_form': profile_form, 'data': data},)
else:
return HttpResponseRedirect('/simofa/login')
使用该代码,data
无法传递到 html 模板。
当我像这样更改渲染时
return render(request, template_name,data)
它工作正常,但 user_form 和 profile_form 没有传递给模板。
我的问题:
- 我可以将
data, user_form, profile_form
一起传递给模板吗?
- 如果可以,怎么做?如果不行,还有其他办法吗?
非常感谢您的意见。所以请帮助我。谢谢^__^
render 语句不像定义元组时那样需要尾随逗号,这很可能是导致错误的原因,但是您的代码可以使用一些重构....
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
# assuming you're using your own form here for some reason...
from .forms import UserForm
# use the login_required decorator instead of manually checking for the session
@login_required
def tambah_user(request, template_name='form_user.html'):
# `users` just makes more sense here for the variable name
users = User.objects.all()
# no need for the extra if clause to create unbound forms
user_form = UserForm(request.POST or None)
profile_form = UserProfileForm(request.POST or None)
if request.method == 'POST':
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
# you need to pass in the raw password here,
# otherwise you're hashing the already hashed password
# if you were to be editing an instance
user.set_password(user_form.cleaned_data('password'))
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
# you need to use reverse by name to do this
return redirect(reverse('manajemen_user'))
else:
print user_form.errors, profile_form.errors
# notice I have omitted the trailing comma after the context
# dictionary
return render(request, template_name, {'user_form': user_form,
'profile_form': profile_form, 'data': users})
我希望你已经阅读了 Django 中的 documentation for authentication,因为有内置的表单和视图可以为用户做几乎所有你需要做的事情,而不是你自己写。
我是 django 的新手,我正在尝试创建一个应用程序,用户可以根据 his/her id 更改 his/her 密码。到目前为止还不错,但是当我试图从我的 views.py 传递一个参数时,有一个参数无法传递给 html 模板的问题。
这是我的看法:
def tambah_user(request, template_name='form_user.html'):
if 'username' in request.session:
username = User.objects.all()
data = {}
data['object_list'] = username
if request.method == 'POST':
user_form = UserForm(data=request.POST)
profile_form = UserProfileForm(data=request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
return redirect('manajemen_user')
else:
print user_form.errors, profile_form.errors
else:
user_form = UserForm()
profile_form = UserProfileForm()
return render(request, template_name,
{'user_form': user_form, 'profile_form': profile_form, 'data': data},)
else:
return HttpResponseRedirect('/simofa/login')
使用该代码,data
无法传递到 html 模板。
当我像这样更改渲染时
return render(request, template_name,data)
它工作正常,但 user_form 和 profile_form 没有传递给模板。
我的问题:
- 我可以将
data, user_form, profile_form
一起传递给模板吗? - 如果可以,怎么做?如果不行,还有其他办法吗?
非常感谢您的意见。所以请帮助我。谢谢^__^
render 语句不像定义元组时那样需要尾随逗号,这很可能是导致错误的原因,但是您的代码可以使用一些重构....
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
# assuming you're using your own form here for some reason...
from .forms import UserForm
# use the login_required decorator instead of manually checking for the session
@login_required
def tambah_user(request, template_name='form_user.html'):
# `users` just makes more sense here for the variable name
users = User.objects.all()
# no need for the extra if clause to create unbound forms
user_form = UserForm(request.POST or None)
profile_form = UserProfileForm(request.POST or None)
if request.method == 'POST':
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
# you need to pass in the raw password here,
# otherwise you're hashing the already hashed password
# if you were to be editing an instance
user.set_password(user_form.cleaned_data('password'))
user.save()
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
# you need to use reverse by name to do this
return redirect(reverse('manajemen_user'))
else:
print user_form.errors, profile_form.errors
# notice I have omitted the trailing comma after the context
# dictionary
return render(request, template_name, {'user_form': user_form,
'profile_form': profile_form, 'data': users})
我希望你已经阅读了 Django 中的 documentation for authentication,因为有内置的表单和视图可以为用户做几乎所有你需要做的事情,而不是你自己写。