我正在尝试扩展用户模型
所以我创建了一个名为employee的新模型,其中外键指向用户模型
from django.db import models
from django.contrib.auth.models import User
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
department = models.CharField(max_length=200)
并尝试创建注册表单
from django.contrib.auth.forms import UserCreationForm
from employee.models import Employee
class EmployeeForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = Employee
fields = UserCreationForm.Meta.fields + ('department',)
这些是我所做的唯一更改,但出现以下错误:
文件“ /home/sugumar/python/django/project1/project1/urls.py”,行 18,在 从employee.views导入注册文件“ /home/sugumar/python/django/project1/employee/views.py”,第2行,在 从.forms导入EmployeeForm文件“ /home/sugumar/python/django/project1/employee/forms.py”,第4行,在 class EmployeeForm(UserCreationForm):文件“ /home/sugumar/.local/share/virtualenvs/project1-j0yhUYNK/lib/python3.5/site-packages/django/forms/models.py”, 第266行,新建 引发FieldError(message)django.core.exceptions.FieldError:为Employee指定的未知字段(用户名)
答案 0 :(得分:3)
我正在尝试扩展用户模型,所以我创建了一个名为employee的新模型,并在用户模型中带有外键。
通过使用OneToOneField
,确实可以扩展用户系统,但是您不能简单地使用它在同一Form
中处理两个模型,从而构造一次两个对象。
您在这里基本构造的是在ModelForm
模型上的Employee
,但是在这里您构造了带有额外字段的Meta
类,但是这些字段与模型字段无关Employee
对象,因此出现错误。
简单地构造两种形式可能更好,因此Employee
-形式如下:
# app/forms.py
from django.forms import ModelForm
class EmployeeForm(ModelForm):
class Meta:
model = Employee
fields = ('department',)
,然后创建一个像这样的视图:
# app/views.py
from django.contrib.auth.forms import UserCreationForm
from app.forms import EmployeeForm
def create_user(request):
if request.method == 'POST':
user_form = UserCreationForm(request.POST)
employee_form = EmployeeForm(request.POST)
if user_form.is_valid() and employee_form.is_valid():
user = user_form.save()
employee = employee_form.save(commit=False)
employee.user = user
employee.save()
return redirect('...')
else:
user_form = UserCreationForm()
employee_form = EmployeeForm()
return render(
request,
'app/my_template.html',
{'user_form': user_form, 'employee_form': employee_form}
)
在这种情况下,鉴于两种形式均有效,我们将创建一个User
和Employee
对象,并将employee
链接到user
。我们进一步以两种形式渲染模板。
在模板中,我们将两个表单呈现在相同的<form>
标签中:
<!-- app/templates/app/my_template.html -->
<form action="{% url 'app:create_user' %}" method="post">
{% csrf_token %}
{{ user_form }}
{{ employee_form }}
</form>
'app:create_user'
是指向上面定义的视图的URL的名称。