我有以下代码来编辑用户:
@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,
})
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
用户确实已更新,但我有这些“附带效果”。
答案 0 :(得分:1)
正如您在Django User Model上看到的那样,您所说的权限是您不会从“UserForm”中排除的字段,因此设置为False,因为您似乎没有在request.POST数据中提供值。要100%,它将有助于了解您如何呈现表单,但这很可能是问题。