我有一個帳戶頁面,我有三種形式。用戶可以更改他的姓名,他的電子郵件地址和密碼。同一頁面上處理多個表格
有我從想這樣做有兩個難點:
1)request.user信息沒有相應地更新(例如,它會通過一個改變落後或者如果表單將更新沒有驗證)
2)我有三種不同的形式,但是當我提交一個表單時,我會從另一個表單中獲取驗證消息。例如,如果我提交「更改名稱」表單,我將從密碼錶單中的密碼字段獲取'This field is required
。以下是我目前有 -
的形式:
# in forms.py
from django.contrib.auth.models import User
class ChangeNameForm(ModelForm):
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
class Meta:
model = User
fields = ('first_name', 'last_name')
class ChangeEmailForm(ModelForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('email',)
的觀點:
@login_required
def account(request):
name_message = password_message = email_message = ''
change_name_form = ChangeNameForm(data=request.POST or None, instance=request.user)
change_password_form = PasswordChangeForm(data=request.POST or None, user = request.user)
change_email_form = ChangeEmailForm(data=request.POST or None, instance=request.user)
if request.method == "POST":
if "change_name" in request.POST and change_name_form.is_valid():
change_name_form.save()
name_message = 'Your name has been changed.'
if "change_password" in request.POST and change_password_form.is_valid():
change_password_form.save()
password_message = 'Your password has been changed.'
if "change_email" in request.POST and change_email_form.is_valid():
...
email_message = 'Please click the link in your email to confirm changes.'
return render_to_response('userprofile/account.html',
{'change_name_form': change_name_form,
'change_email_form': change_email_form,
'change_password_form': change_password_form,
'password_message': password_message,
'name_message': name_message,
'email_message': email_message,},
context_instance=RequestContext(request))
模板:
<h3>Change Name</h3>
<form method="post" action="/account/change/" name='name'> {% csrf_token %}
<h4>Change name: {{user.first_name}} {{user.last_name}}</h4>
<table>{{change_name_form.as_table}}</table>
<p>{{name_message}}</p>
<p><input type="submit" value="Save Changes" name="change_name"/></p>
</form>
<h3>Change Email</h3>
<form method="post" action="/account/change/" name='email'> {% csrf_token %}
<h4>Change email: {{user.email}}</h4>
<table>{{change_email_form.as_table}}</table>
<p>{{email_message}}</p>
<p><input type="submit" value="Save Changes" name="change_email" /></p>
</form>
<h3>Change Password</h3>
<form method="post" action="/account/change/" name='password'> {% csrf_token %}
<h4>Change password</h4>
<table>{{change_password_form.as_table}}</table>
<p>{{password_message}}</p>
<p><input type="submit" value="Save Changes" name="change_password"/></p>
</form>
什麼我需要做什麼來解決這兩個問題確保request.user信息是最新的,並確保驗證僅針對當前表單運行?另外,是否可以運行for loop
來減少模板代碼中的冗餘?如果是這樣,我將如何做到這兩個name
字段的事實?謝謝。
啊我明白了,謝謝你的解釋。你知道爲什麼request.user信息不是最新的嗎? – David542 2011-06-07 21:15:55