django - 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'
…
解决方案
推荐阅读
- r - 使 file.exists() 不区分大小写
- laravel - 插件安装注册后 Laravel 不起作用
- javascript - Javascript 将过滤器应用于对象列表并隐藏相应的部分分隔符(部分分隔符和列表元素是分开的)
- sql - SQL显示重复数列
- python - 将变量 Pandas DataFrame 的所有日期时间列转换为不同的时区
- kotlin - 使用 copy() 填充不可变字段
- java - JBOSS EAP 7.2 包装 STDOUT 和 STDERR 消息
- html - 仅使用 css 创建高度等于整个页面长度的元素(无 javascript)
- ruby-on-rails - 如何准确设置 RoR 通道来回发送数据
- android - 尝试写入文件时Android应用程序崩溃