2017-08-02 11 views
0

Hallo Ich arbeite an einem Formular, um ein Benutzerprofil zu bearbeiten. Es aktualisiert die Felder ordnungsgemäß nach erfolgreicher Übermittlung ohne Validierungsfehler. Das Problem, das ich habe, ist, dass, wenn das Formular einen Validierungsfehler bei der Einreichung zurückgibt und ich den Namen auf dem Formular geändert habe, zeigt die Vorlage diesen neuen Namen anstelle des alten Namens. Ich nehme an, dass das ist, weil es den Benutzerkontext verwendet, der von der POST-Anforderung bereitgestellt wird. Gibt es eine Möglichkeit, den alten Namen des Benutzers korrekt anzuzeigen, bis das Formular tatsächlich erfolgreich übermittelt wurde? Unten ist mein Code.Django - Vorlage zeigt bearbeitet Benutzer Kontextinformationen trotz 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> 

Antwort

0

eine separate Instanz des Benutzers aus der DB Fetch mit der Form zu verwenden. Auf diese Weise wird die request.user nicht geändert, wenn das Formular validiert wird.

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

Danke, das hat perfekt funktioniert! –

Verwandte Themen