繁体   English   中英

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

[英]django.core.exceptions.FieldError: Unknown field(s) (username) specified for 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 行,在类 EmployeeForm(UserCreationForm) 中:文件“/home/sugumar/.local/share /virtualenvs/project1-j0yhUYNK/lib/python3.5/site-packages/django/forms/models.py", line 266, in new raise FieldError(message) django.core.exceptions.FieldError: Unknown field(s) (用户名)为员工指定

我正在尝试扩展用户模型,因此我创建了一个名为employee的新模型,其中外键指向用户模型。

通过使用OneToOneField ,确实可以扩展用户系统,但是您不能简单地使用它来在同一Form处理两个模型,从而一次构造两个对象。

您基本上在这里构造的是Employee模型上的ModelForm ,但是这里您构造了带有额外字段的Meta类,但是这些字段与Employee对象上的模型字段无关,因此会出现错误。

简单地构造两个表单可能更好,因此Employee -form看起来像:

# 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名称。

我遇到过同样的问题。

我解决了它删除所有对员工的引用。 然后:

python manage.py migrate

最后添加 Employee 并完成迁移:

python manage.py makemigrations        
python manage.py migrate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM