【问题标题】:ModelForm has no model class specified.[django]ModelForm 没有指定模型类。[django]
【发布时间】:2020-10-04 19:02:16
【问题描述】:

在我的表格中,我有:

from pydoc import locate

from django import forms
from django.conf import settings

from django.contrib.auth.forms import UserCreationForm, UsernameField
from django.core.validators import EmailValidator

class SignUpForm(UserCreationForm):
    username = UsernameField(label=_("Username"), widget=forms.TextInput(), )
    email = forms.EmailField(max_length=254, label="Email", widget=forms.EmailInput(), validators=[EmailValidator])

    class Meta:
        model = locate(settings.AUTH_USER_MODEL)   <--- HERE
        fields = ("username", "email", "password1", "password2")

模型中的用户应用中:

class Profile(AbstractUser):

    def __str__(self):
        return self.username

在我的project settings.py中我设置了

AUTH_USER_MODEL = 'user.Profile'

它给了我

ValueError at /user/register 
ModelForm has no model class specified.

当我将 in 我的 form 类 Meta 更改为:

class Meta:

        model = Profile   <--- HERE

一切正常。为什么我的 model = locate(settings.AUTH_USER_MODEL) 不起作用?

【问题讨论】:

  • 定位是做什么的?
  • 也许locate 方法没有返回模型类?
  • locate 应该转到设置并从那里获取:AUTH_USER_MODEL = 'user.Profile'
  • @AM0k:问题在于'user.Profile' 不是有效的限定名称。那应该是user.models.Profile(但你不能使用它,因为 Django 使用稍微不同的命名系统)。可以使用apps.get_model(..),但是对于用户模型,可以直接使用get_user_model())。
  • 非常感谢...我有与我的完全相同的解决方案。没关系,我不工作

标签: python django authentication


【解决方案1】:

您可以使用get_user_model() method [Django-doc] 来获取对您指定为AUTH_USER_MODEL 的模型的引用:

from django.contrib.auth import get_user_model

class SignUpForm(UserCreationForm):
    username = UsernameField(
        label=_('Username'),
        widget=forms.TextInput()
    )
    email = forms.EmailField(
        max_length=254,
        label='Email',
        widget=forms.EmailInput(),
        validators=[EmailValidator]
    )

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

locate 在这种情况下不起作用,因为它是returns None in case the module is not found,因此它“默默地失败”。 Profile 类的位置是user.models.Profile,Django 只有一些特殊的语法<i>app_name</i>.<i>ModelName</i> 用于引用模型。

对于其他型号,您可以使用apps.get_model(…) function [Django-doc]

from django.apps import apps
from django import forms

# name of the model
model_name = 'app_name.ModelName'

class MyModelForm(forms.ModelForm):
    class Meta:
        model = apps.get_model(model_name)
        fields = '__all__'

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2013-11-22
    • 2014-05-18
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2020-12-07
    相关资源
    最近更新 更多