You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django中AUTH_USER_MODEL字符串转换为实际模型类?

解决Django中关联自定义User模型时表单集的AttributeError问题

这个问题我之前也碰到过!问题出在你把USER_MODEL设成了字符串,而Django的ModelForm和inlineformset_factory需要的是实际的模型类对象,不是字符串,所以才会抛出AttributeError: 'unicode' object has no attribute '_meta'这个错误。

下面提供两种靠谱的解决方法,优先推荐第一种官方最佳实践:

方法一:使用官方推荐的get_user_model()

Django专门提供了get_user_model()方法来获取当前项目配置的用户模型(不管是默认的auth.User还是自定义的用户模型),这是最稳妥的方式:

from django.forms import ModelForm
from django.forms.models import inlineformset_factory
from optin.models import UserOptin
from django.contrib.auth import get_user_model  # 导入get_user_model

# 获取实际的用户模型类,自动读取AUTH_USER_MODEL配置
User = get_user_model()

class UserForm(ModelForm):
    class Meta:
        model = User  # 直接用模型类,不是字符串
        fields = '__all__'

class UserOptinForm(ModelForm):
    class Meta:
        model = UserOptin
        fields = '__all__'

# 这里第一个参数传模型类User,不是字符串
UserOptinFormSet = inlineformset_factory(User, UserOptin, form=UserOptinForm, extra=0)

这个方法的好处是完全不用手动处理字符串,Django会自动帮你处理AUTH_USER_MODEL的配置,避免解析字符串时可能出现的错误。

方法二:从字符串解析出模型类(适合特殊场景)

如果因为某些原因你已经拿到了字符串形式的AUTH_USER_MODEL,可以用django.apps的get_model()方法把字符串转换成模型类:

from django.forms import ModelForm
from django.forms.models import inlineformset_factory
from optin.models import UserOptin
from django.conf import settings
from django.apps import apps  # 导入apps

# 从settings获取字符串形式的用户模型配置
USER_MODEL = settings.AUTH_USER_MODEL
# 把字符串解析成实际的模型类
User = apps.get_model(USER_MODEL)

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = '__all__'

class UserOptinForm(ModelForm):
    class Meta:
        model = UserOptin
        fields = '__all__'

UserOptinFormSet = inlineformset_factory(User, UserOptin, form=UserOptinForm, extra=0)

注意:AUTH_USER_MODEL的格式必须是app_label.ModelName(比如默认的auth.User),apps.get_model()才能正确解析。

内容的提问来源于stack exchange,提问作者HenryM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:25:08