2016-03-26 14 views
2

Ich versuche herauszufinden, wie Benutzer ihr Profil ändern können. Ich habe eine Users erweitert um User Profile (OneToOne).Wie kann der Benutzer seine Attribute ändern?

Ich habe darüber nachgedacht, Registrierungsansicht zu ändern, Benutzerattribute vorzufüllen und ihm zu erlauben, sie zu ändern. Aber es ist wahrscheinlich nicht der gute Weg.

Können Sie mir einen Hinweis geben, wie das geht?

class UserForm(forms.ModelForm): 
    password1 = forms.CharField(widget=forms.PasswordInput()) 
    password2 = forms.CharField(widget=forms.PasswordInput()) 

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

    def clean(self): 
     password1 = self.cleaned_data.get('password1') 
     password2 = self.cleaned_data.get('password2') 

     if password1 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 

     return self.cleaned_data 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('telephone','marital_status','how_do_you_know_about_us') 

MODELS.PY

class UserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE) 

    # ATRIBUTY KTORE BUDE MAT KAZDY 
    telephone = models.CharField(max_length=40,null=True) 

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
      ('coincidence',u'It was coincidence'), 
      ('relative_or_friends','From my relatives or friends'), 
      ) 
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True) 

    MARITAL_STATUS_CHOICES = (
     ('single','Single'), 
     ('married','Married'), 
     ('separated','Separated'), 
     ('divorced','Divorced'), 
     ('widowed','Widowed'), 
    ) 
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True) 

    # OD KIAL STE SA O NAS DOZVEDELI 
    # A STAV 

    def __unicode__(self): 
     return '{} {}'.format(self.user.first_name,self.user.last_name) 

    def __str__(self): 
     return '{} {}'.format(self.user.first_name,self.user.last_name) 

REGISTRATION VIEW:

def register(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST) 
     profile_form = UserProfileForm(request.POST) 
     if user_form.is_valid() and profile_form.is_valid(): 

      user = user_form.save() 
      user.set_password(user_form.cleaned_data['password1']) 
      user.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 

      profile.save() 
      return register_success(request) 

     else: 
      print user_form.errors, profile_form.errors 

    else: 
     user_form = UserForm() 
     profile_form = UserProfileForm() 

    return render(request, "auth/registration/register.html", 
        context={'user_form': user_form, 'profile_form': profile_form}) 

EDIT:

Dies ist die Ansicht Ich versuche zu schaffen, aber es tut nicht automatisch ausfüllen:

@login_required 
def edit_profile(request): 
    myUser = request.user 
    user_form = UserForm(request.POST, instance=myUser) 
    user_profile_form = UserProfileForm(request.POST, instance=myUser) 

    context={'user_form': user_form, 
      'user_profile_form':user_profile_form} 
    return render(request, 'auth/profiles/my_profile.html', context=context) 
+0

Ich verstehe nicht, was Sie denken, es ist kein guter Weg? –

+0

Ich weiß nicht, ich vermute, dass es ein eingebautes Modul dafür gibt. Aber es funktioniert nicht. Ich habe eine Frage hochgeladen. –

Antwort

1

Im edit_profile sehen Sie selbst hinzugefügt haben, werden Sie Ihre Formulare eine POST-Anforderung Argument übergeben. Sie sollten dieses Argument nur bei einer POST-Anfrage übergeben. So aktualisieren Sie Ihre Formulare, die folgenden sein, wenn die Anforderung eine Anforderung GET ist:

views.py

user_form = UserForm(instance=myUser) 
user_profile_form = UserProfileForm(instance=myUser) 

forms.py

# Something like this will only save password if data is entered in one of the password fields 
def clean(self): 
    cleaned_data = super(UserForm, self).clean() 
    password1 = cleaned_data.get('password1', None) 
    password2 = cleaned_data.get('password2', None) 
    old_password = cleaned_data.get('old_password', None) 
    if password1 or password2: 
     if password1 != password2: 
      self._errors['password1'] = 'New Password and Confirm New Password must match.' 
      self._errors['password2'] = 'New Password and Confirm New Password must match.' 
     if not self.user.check_password(old_password): 
      self._errors['old_password'] = 'Your old password was entered incorrectly.' 
    return cleaned_data 

def save(self, request): 
    user = self.user 
    if self.cleaned_data.get('password1', None): 
     user.set_password(self.cleaned_data.get('password1')) 
     update_session_auth_hash(request, user) 
    user.save() 
    return user 

Für Ihre Auswahl Ausgabe können Sie festlegen, wie Entscheidungen ein Argument beim Angeben von Widgets für das Feld.

+0

Danke curtis, das funktioniert, aber teilweise. Die Auswahlformen sind nicht ausgefüllt. Weißt du, was das Problem ist? Der aktive Benutzer hat diese Formulare bereits ausgefüllt. Und wie man Passwort1 und Passwort2 ausschließt? –

+0

Und das Telefon ist auch nicht gefüllt. Es ist wahrscheinlich, weil ich Benutzer als Attribut setze, aber in der zweiten Form sollte UserProfile sein. Aber wie kann ich es mit Benutzerinstanz bekommen? –

+0

Ich habe meine Antwort aktualisiert, um die Auswahlfelder und die Passwörter zu adressieren. Sehen Sie, ob Sie das als Anfang verwenden können. Beachten Sie bei der Benutzerprofilform, dass Sie die Profilinstanz eines Benutzers verwenden möchten, nicht unbedingt die Instanz des Benutzers selbst. Beachten Sie auch, dass ich dem Formular (ungebundenes Feld) ein 'altes_Kennwort'-Feld hinzugefügt habe. Ich finde es eine gute Übung, das Passwort zu bestätigen, bevor Sie es ändern können. –

Verwandte Themen