首页 > 解决方案 > Django中扩展AbstractUser的空UpdateView表单

问题描述

我正在尝试构建我的第一个 Django 自定义用户模型,将AbstractUser扩展为MyUser ,然后它与我的Employee类(以及后来的其他类,如Contractor )具有 OneToOne 关系。我正在使用 GCBV,并按预期创建和显示新员工的工作,但是更新表单包含正确的字段,但它们是空的,我不明白为什么。

数据库包含来自创建的预期数据。

我有其他 GCBVs 在没有用户连接的情况下使用完整的 CRUD 来处理课程,所以我希望我能理解到足以让用户部分工作 - 显然不是!我是否需要为 Create 或非用户相关模型所需的 Update 做一些额外的事情?

任何帮助将不胜感激 - 这是我在这里的第一篇文章,所以我希望我提供了足够的细节:

模型.py

class MyUser( AbstractUser ):
    # Uses username, first_name, last_name and email from AbstractUser
    is_employee = models.BooleanField( default = False, verbose_name=_('Staff'))
    is_contractor = models.BooleanField( default = False, verbose_name=_('Contractor'))

class Employee( models.Model ):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,       # MyUser
        on_delete=models.CASCADE,
        related_name='employee',
    )

    is_staff_admin = models.BooleanField( default=False, null=True, verbose_name=_('Administrator') )

视图.py

class EmployeeUpdateView( UpdateView ):
    model = Employee
    pk_url_kwarg = 'employee_pk'
    template_name = 'employees/employee_create_and_update.html'
    form_class = EmployeeChangeForm 
    success_url = None
    context_object_name = 'employee'

表格.py

class MyUserChangeForm( UserChangeForm ):
    class Meta:
        model = get_user_model()   # MyUser
        fields = (
            # AbstractUser fields
            'username',
            'email',
            'first_name',
            'last_name',
            # MyUser fields
            # None yet - is_employee is not visible on the form
        )

class EmployeeChangeForm( MyUserChangeForm ):
    class Meta( MyUserChangeForm.Meta ):
        model = MyUser

模板/员工/employee_create_and_update.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
    <form method='POST'>
        {% csrf_token %}
        {{ form|crispy }}
        {% include "create_update_buttons_snippet.html" %}
    </form>
{% endblock %}

网址.py

…
    path( 'employee/update/<int:employee_pk>/',  EmployeeUpdateView.as_view(),        name='employee_update' ),
…

设置.py

…
# Use MyUser rather than the default User model
AUTH_USER_MODEL = 'accounts.MyUser'
…

标签: django

解决方案


推荐阅读