python - How to allow user to change his attributes? -


i'm trying figure out how allow users change profile. have users extended user profile (onetoone).

i thinking changing registration view, prefill user's attributes , allow him change them. not way.

could give me hint how that?

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 , 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 coincidence'),             ('relative_or_friends','from 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     # 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() , 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:

this view i'm trying create not autofill form:

@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) 

in edit_profile view added, you're passing forms post request argument. should passing argument on post request. update forms following if request request:

views.py

user_form = userform(instance=myuser) user_profile_form = userprofileform(instance=myuser) 

forms.py

# save password if data entered in 1 of 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 , confirm new password must match.'             self._errors['password2'] = 'new password , confirm new password must match.'         if not self.user.check_password(old_password):             self._errors['old_password'] = 'your old password 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 

for choices issue, can specify choices argument when specifying widgets field.


Comments