【问题标题】:User creation form in DjangoDjango中的用户创建表单
【发布时间】:2019-11-26 07:46:27
【问题描述】:

我正在参加在线 Djago 课程,没有人可以寻求帮助。我很乐意获得任何帮助和提示。

我正在学习创建表单(登录/登录)。

到目前为止,我在models.py做过

from django.db import models
from django.contrib import auth


class User(auth.models.User,auth.models.PermissionsMixin):

    def __str__(self):
        return "@{}".format(self.username)

forms.py

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserCreateForm(UserCreationForm):

    class Meta:
        fields = ('username','email','password1','password2')
        model = get_user_model()

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['username'].label = 'Display Name'
        self.fields['email'].label = 'Email Address'

我想添加额外的 firelds 作为姓,但是当我在 class meta 中添加 'surname' fields (forms.py) 时出现错误,但是在线培训说我可以轻松添加其他字段。你能告诉我我做错了什么以及如何添加这个字段吗?

当我在forms.py 中添加这些字段'surname' 时:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserCreateForm(UserCreationForm):

    class Meta:
        fields = ('username','email','surname','password1','password2')
        model = get_user_model()

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['username'].label = 'Display Name'
        self.fields['surname'].label = 'Surname'
        self.fields['email'].label = 'Email Address'

它给出以下错误:

raise FieldError(message)
django.core.exceptions.FieldError: Unknown field(s) (surname) specified for User

views.py我啊:

from django.shortcuts import render
from django.urls import reverse_lazy
from django.views.generic import CreateView,TemplateView
from . import forms

class SignUp(CreateView):
    form_class = forms.UserCreateForm
    success_url = reverse_lazy('login')
    template_name = 'accounts/signup.html'

【问题讨论】:

  • 你能详细说明错误吗?堆栈跟踪会很有帮助。
  • 您需要将surname 字段添加到您的User 模型并运行migrations。然后您可以将该字段添加到您的UserCreateForm
  • 我添加了错误
  • 我无法进行迁移,因为终端显示我在上面发布的错误,它说“姓氏”是未知的花边

标签: django mixins


【解决方案1】:
# In your forms.py, you need to add new field 'surname'

For Example:-
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserCreateForm(UserCreationForm):
    surname = forms.CharField(max_length=20)

    class Meta:
        fields = ('username','email','surname','password1','password2')
        model = get_user_model()

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['username'].label = 'Display Name'
        self.fields['surname'].label = 'Surname'
        self.fields['email'].label = 'Email Address'

【讨论】:

  • 请从 django 导入表单。我已经编辑了代码。请检查
  • 谢谢。在我写之前。导入表格,它不起作用,但文档说。和 djhango 应该以同样的方式工作。
【解决方案2】:

首先,您使用的是get_user_model() 方法,但您使用的是自定义User 模型。

在你的设置中设置AUTH_USER_MODEL:

AUTH_USER_MODEL = 'app.User'

然后将surname 字段添加到您的User 模型中:

class User(auth.models.User):
    surname = models.Charfield()

    def __str__(self):
        return "@{}".format(self.username)

运行并应用迁移。然后您就可以将surname 字段添加到您的表单fields

class UserCreateForm(UserCreationForm):

    class Meta:
        fields = ('username','email','surname','password1','password2')
        model = get_user_model()

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['username'].label = 'Display Name'
        self.fields['surname'].label = 'Surname'
        self.fields['email'].label = 'Email Address'

【讨论】:

    【解决方案3】:

    您需要对forms.py 文件进行以下更改:-

    from appname.models import USER 
    from django.contrib.auth.forms import UserCreationForm
    
    class UserCreateForm(UserCreationForm):
    
        class Meta:
            fields = ('username','email','surname','password1','password2')
            model = USER
    
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            self.fields['username'].label = 'Display Name'
            self.fields['surname'].label = 'Surname'
            self.fields['email'].label = 'Email Address'
    

    【讨论】:

      猜你喜欢
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      相关资源
      最近更新 更多