django.core.exceptions.FieldError:为员工指定了未知字段(用户名)

时间:2019-01-03 21:57:57

标签: python django

我正在尝试扩展用户模型

所以我创建了一个名为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指定的未知字段(用户名)

1 个答案:

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

在这种情况下,鉴于两种形式均有效,我们将创建一个UserEmployee对象,并将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的名称。