如何将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
相关产品推荐
相关产品推荐

