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
Post a Comment