如何允许用户更改其属性?

时间:2016-03-26 16:14:58

标签: python django django-forms django-views

我试图找出如何允许用户更改其个人资料。我有一个Users延长User Profile(OneToOne)。

我正在考虑更改注册视图,预填充用户的属性并允许他更改它们。但这可能不是好方法。

你能给我一个如何做到这一点的提示吗?

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)

注册视图:

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

编辑:

这是我试图创建的视图,但它不会自动填充表单:

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

1 个答案:

答案 0 :(得分:1)

在您添加的edit_profile视图中,您正在向表单传递POST请求参数。您应该只在POST请求上传递此参数。因此,如果请求是GET请求,请将表单更新为以下内容:

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

对于您的选择问题,您可以在为字段指定窗口小部件时将选项指定为参数。