首页 > 解决方案 > 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消息的位置,但数据库中的用户没有更新。 这里有什么问题?

标签: pythondjangodjango-modelsdjango-formsdjango-views

解决方案


我的意见是您没有从数据库中选择用户,我会通过以下方式处理此问题。

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

推荐阅读