用户在更新Django

时间:2016-01-31 14:51:56

标签: python django

我有以下代码来编辑用户:

View.py

@login_required()
def edit_user_profile(request):

if request.method == 'POST':
    profile_form = ProfileForm(request.POST, instance=request.user.profile)
    user_form = UserForm(request.POST, instance=request.user, request=request)
    city_form = CityForm(request.POST)

    if profile_form.is_valid() and user_form.is_valid() and city_form.is_valid():

        # Updates profile
        try:
            user_profile = profile_form.save(commit=False)
            user_profile.user = user_form.save()
            user_profile.city = city_form.get_instance()

            # Save instance
            user_profile.save()
        except Exception:
            raise

        # Checks if user came from another page
        previous_page = request.GET.get('next', None)
        if previous_page:
            return HttpResponseRedirect(previous_page)

        return redirect(profile_update_success)
else:

    profile_form = ProfileForm(instance=request.user.profile)
    user_form = UserForm(instance=request.user)
    city_form = CityForm(initial={'post_nr': request.user.profile.get_city_post_code(), 'city': request.user.profile.get_city_name()})

return render(request, 'user/profile.html',
              {
                  'user': request.user,
                  'profile_form': profile_form,
                  'user_form': user_form,
                  'city_form': city_form,
              })

Forms.py

class UserForm(ModelForm):
    first_name = forms.CharField(required=True, max_length=10, widget=forms.TextInput(attrs={'placeholder': 'First name'}))
    last_name = forms.CharField(required=True, max_length=20, widget=forms.TextInput(attrs={'placeholder': 'Last name'}))
    email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'placeholder': 'E-mail'}))

    class Meta:
        model = User
        exclude = ('username', 'password', 'date_joined', )

    def clean_email(self):
        email = self.cleaned_data['email']

        try:
            user = User.objects.get(email=email)
            if self.instance.username != user.username:
                raise forms.ValidationError("This e-mail is already in use.")
        except User.DoesNotExist:
            pass
        return email

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(UserForm, self).__init__(*args, **kwargs)


class ProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ('city', 'user',)
        widgets = {
            'company_name': forms.TextInput(attrs={'placeholder': "*Optional company name"}),
            'telephone': forms.TextInput(attrs={'placeholder': "*Optional telephone number"}),
            'mobile': forms.TextInput(attrs={'placeholder': "Mobile number"}),
        }

每次用户更新他/她的信息时都会出现问题。该帐户设置为“无效”。管理员也会发生同样的事情,他们失去了“员工”和“超级用户”的状态。

我还有以下signal忽略管理员状态时无效。它确实有助于防止帐户被设置为“无效”。

@receiver(pre_save, sender=User)
def update_username_from_email(sender, instance, **kwargs):
    if not instance.email or instance.is_superuser:
        return
    instance.username = instance.email
    instance.is_active = True

用户确实已更新,但我有这些“附带效果”。

1 个答案:

答案 0 :(得分:1)

正如您在Django User Model上看到的那样,您所说的权限是您不会从“UserForm”中排除的字段,因此设置为False,因为您似乎没有在request.POST数据中提供值。要100%,它将有助于了解您如何呈现表单,但这很可能是问题。

相关问题