2011-06-07 47 views
0

我有一個帳戶頁面,我有三種形式。用戶可以更改他的姓名,他的電子郵件地址和密碼。同一頁面上處理多個表格

有我從想這樣做有兩個難點:

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字段的事實?謝謝。

回答

2

我認爲馬丁表示:

@login_required 
def account(request): 
    name_message = password_message = email_message = '' 
    if request.method == "POST": 
     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) 
     ... 
    else: 
     change_name_form = ChangeNameForm(instance=request.user) 
     change_password_form = PasswordChangeForm(instance = request.user) 
     change_email_form = ChangeEmailForm(instance=request.user) 
    ... 
    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)) 

如果請求這個觀點是POST(即用戶試圖編輯他們的賬戶),你實例化請求POST屬性的形式。如果他們剛剛到達編輯頁面,但沒有執行編輯(即他們還沒有發佈任何表單),那麼就用來自數據庫的數據實例化表單

+0

啊我明白了,謝謝你的解釋。你知道爲什麼request.user信息不是最新的嗎? – David542 2011-06-07 21:15:55

1

要回答第二個問題,即使在特定表單不是觸發的表單的情況下,也要使用POSTd數據實例化所有3個表單。這將觸發所有3種形式的驗證。我會將表單實例化下移到您在下面的if聲明中,在那裏您檢查是否存在相應的submit按鈕。

+0

我不太關注。您能否發佈您的代碼部分? – David542 2011-06-07 20:23:27

+0

像這樣: '如果request.POST.has_key( 'change_password'): change_password_form = PasswordChangeForm(數據= request.POST,用戶= request.user) elif的request.POST.has_key( 'change_name'): change_name_form = ChangeNameForm(數據= request.POST,用戶= request.user) ...' 哎,遺憾的格式。不知道如何正確格式化評論。 – Martin 2011-06-08 14:30:00

相關問題