python - Python - 在 Django 2.2 中更新用户
问题描述
我正在使用 Python(3.7) 和 Django(2.2) 开发一个项目,其中我通过扩展基本用户模型为多种类型的用户实现了模型。现在我需要实现一种方法来允许管理员用户编辑用户(不能使用默认的 Django 管理员)。因此,我利用MultiModelForm在单个模板上组合多个表单,在获取请求时,表单正在正确加载并填充数据。这是我到目前为止所做的:
来自models.py
:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=254, unique=True)
name = models.CharField(max_length=255)
title = models.CharField(max_length=255, choices=TITLE, blank=False)
user_type = models.CharField(max_length=255, choices=USER_TYPE, blank=False)
gender = models.CharField(max_length=255, choices=CHOICES, blank=False)
contenst = models.CharField(max_length=255, blank=True, null=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
email_status = models.CharField(max_length=50, default='nc')
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = ['password']
objects = UserManager()
def get_absolute_url(self):
return "/users/%i/" % (self.pk)
def __str__(self):
return str(self.email)
class ContactPerson(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
contact_email = models.EmailField(blank=False)
customer_id = models.BigIntegerField(blank=True)
contact_no = PhoneNumberField(blank=True, null=True, help_text='Phone number must be entered in the'
'format: \'+999999999\'. Up to 15 digits allowed.')
collection_use_personal_data = models.BooleanField(blank=False)
这是相关的forms.py
:
class EditUserForm(forms.ModelForm):
password = None
class Meta:
model = User
fields = ('email', 'name', 'title', 'gender', 'contenst',)
class UserCPForm(forms.ModelForm):
class Meta:
model = ContactPerson
fields = ('customer_id', 'contact_email', 'contact_no', 'collection_use_personal_data')
class EditUserCPForm(MultiModelForm):
form_classes = {
'user': EditUserForm,
'profile': UserCPForm
}
这是我的相关内容views.py
:
def post(self, request, *args, **kwargs):
id = self.kwargs['id']
if request.user.is_superuser:
id = id
u = User.objects.get(id=id)
print(u.user_type)
u_form = None
elif u.user_type == 'ContactPerson':
print(request.POST)
u_form = EditUserCPForm(request.POST)
# p_form = UserCPForm(request.POST['profile'])
if u_form.is_valid():
print('valid')
user_form = u_form['user']
profile_form = u_form['profile']
ucp_obj = ContactPerson.objects.get(user__id=u.id)
print(ucp_obj.user.email)
ucp_obj.user.email = u_form.cleaned_data['user']['email']
print(ucp_obj.user.email)
ucp_obj.user.name = u_form.cleaned_data['user']['name']
ucp_obj.user.title = u_form.cleaned_data['user']['title']
ucp_obj.user.gender = u_form.cleaned_data['user']['gender']
ucp_obj.user.contenst = u_form.cleaned_data['user']['contenst']
ucp_obj.customer_id = u_form.cleaned_data['profile']['customer_id']
ucp_obj.contact_email = u_form.cleaned_data['profile']['contact_email']
ucp_obj.contact_no = u_form.cleaned_data['profile']['contact_no']
ucp_obj.collection_use_personal_data = u_form.cleaned_data['profile']['collection_use_personal_data']
ucp_obj.save()
u_form.save(commit=False)
print(ucp_obj.user.email)
print(id)
messages.success(request, 'success')
return HttpResponseRedirect(reverse_lazy('dashboard:dashboard-home'))
else:
messages.error(request, 'not valid data')
print(u_form.errors)
return HttpResponseRedirect(reverse_lazy('dashboard:user-edit', u.id))
else:
messages.error(request, 'you are not allowed to do so! ')
return HttpResponseRedirect(reverse_lazy('dashboard:user-edit', id))
当我编辑模板中的任何字段并提交表单时,表单会将我重定向到
dashboard-home
带有success
消息的位置,但数据库中的用户没有更新。 这里有什么问题?
解决方案
我的意见是您没有从数据库中选择用户,我会通过以下方式处理此问题。
user_form = u_form['user']
profile_form = u_form['profile']
ucp_obj = ContactPerson.objects.get(user__id=u.id)
u.email = u_form.cleaned_data['user']['email']
u.name = u_form.cleaned_data['user']['name']
u.title = u_form.cleaned_data['user']['title']
u.gender = u_form.cleaned_data['user']['gender']
u.contenst = u_form.cleaned_data['user']['contenst']
u.save()
ucp_obj.customer_id = u_form.cleaned_data['profile']['customer_id']
ucp_obj.contact_email = u_form.cleaned_data['profile']['contact_email']
ucp_obj.contact_no = u_form.cleaned_data['profile']['contact_no']
ucp_obj.collection_use_personal_data = u_form.cleaned_data['profile']['collection_use_personal_data']
ucp_obj.user = u
ucp_obj.save()
messages.success(request, 'success')
return HttpResponseRedirect(reverse_lazy('dashboard:dashboard-home'))
...还需要更新 EditUserCPForm 实例..
elif u.user_type == 'ContactPerson':
print(request.POST)
curr_user = User.objects.get(id=id)
contact_person = ContactPerson.objects.get(user=u)
print(u.user_type)
u_form = EditUserCPForm(request.POST, instance={
'user': curr_user,
'profile': contact_person
})
推荐阅读
- django - 将 Django 应用程序部署到 Digital Ocean - Gunicorn 错误
- r - Function not returning max value for each row but overall
- javascript - Chrome 调试器:什么是“PropertyBag”对象?
- react-native - 如何在反应原生中声明模型类并通过使用反应导航在第二个屏幕中传递整个模型类
- ios - UIView 在滚动视图中不可滚动
- r - 使用 R 中的 ggplot2 根据框大小对箱线图重新排序
- javascript - React 组件库 + TypeScript
- r - 对数据子集的“颜色”和“填充”实施相同的调色板
- angular - ES6:“对象”类型上不存在“选定”属性
- php - 上传图片 PHP 重命名文件