2017-08-02 69 views
0

嗨我正在編輯用戶的配置文件的窗體。它在成功提交時正確更新字段,而不會出現任何驗證錯誤。我遇到的問題是,如果表單在提交時確實返回了驗證錯誤,並且我更改了表單上的名稱,則模板將顯示此新名稱而不是舊名稱。我假設這是因爲它使用POST請求提供的用戶上下文。在表單實際上成功提交之前,是否有任何方法可以正確顯示用戶的舊名稱?以下是我的代碼。Django - 模板顯示編輯的用戶上下文信息儘管ValidationError

forms.py

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 
from django.forms import ModelForm 

class UserProfileForm(UserCreationForm): 
    first_name = forms.CharField(label="First Name", required=True) 
    last_name = forms.CharField(label="Last Name", required=True) 
    email = forms.EmailField(label="Email", required=True) 

    class Meta: 
     model = User 
     fields = ("first_name", "last_name", "email", "username", "password1", "password2") 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     if email: 
      if User.objects.filter(email=email).exists(): 
       raise forms.ValidationError('This email is already in use.') 
     return email 

    def save(self, commit=True): 
     user = super(UserProfileForm, self).save(commit=False) 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 


class EditProfileForm(ModelForm): 
    first_name = forms.CharField(label="First Name", required=True) 
    last_name = forms.CharField(label="Last Name", required=True) 
    email = forms.EmailField(label="Email", required=True) 
    password1 = forms.CharField(label="New Password", widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Repeat New Password", widget=forms.PasswordInput) 

    class Meta: 
     model = User 
     fields = ("first_name", "last_name", "email", "username", "password1", "password2") 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     if email: 
      if User.objects.filter(email=email).exists(): 
       raise forms.ValidationError('This email is already in use.') 
     return email 

    def save(self, commit=True): 
     user = super(EditProfileForm, self).save(commit=False) 
     user.email = self.cleaned_data['email'] 
     if commit: 
      user.save() 
     return user 

views.py

def register(request): 
    if request.method == 'POST': 
     form = UserProfileForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      new_user = authenticate(username=form.cleaned_data['username'], 
           password=form.cleaned_data['password1']) 
      login(request, new_user) 
      return redirect('/overview') 
    else: 
     if request.user.is_authenticated(): 
      return redirect('/overview') 
     else: 
      form = UserProfileForm() 

    return render(request, "/register.html", {'form': form}) 

@login_required 
def edit_profile(request): 
    if request.method == 'POST': 
     print request.POST 
     form = EditProfileForm(request.POST, instance=request.user) 
     if form.is_valid(): 
      form.save() 
      return redirect('/profile') 
    else: 
     form = EditProfileForm() 

    return render(request, '/edit_profile.html', {'form': form}) 

navbar.html

<li class=""> 
    <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> 
     <img src="/ui/assets/images/user.png" alt="">{{ user.first_name }} {{ user.last_name }} 
     <span class=" fa fa-angle-down"></span> 
    </a> 
    <ul class="dropdown-menu dropdown-usermenu pull-right"> 
     <li><a href="/profile/"> Profile</a></li> 
     <li><a href="/logout/"><i class="fa fa-sign-out pull-right"></i> Log Out</a></li> 
    </ul> 
</li> 

回答

0

從DB獲取所述用戶的一個單獨的實例與所述形式使用。這樣,當表單被驗證時,request.user將不會被修改。

user = User.objects.get(id=request.user.id) 
form = EditProfileForm(request.POST, instance=user) 
+0

感謝這工作完美! –