2017-08-02 9 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

ありがとうございました! –

関連する問題