首页 > 解决方案 > Django 将字符串转换为模型的形式

问题描述

我正在尝试编写一个简单的可重用 Django 应用程序,该应用程序链接到 User 模型,但由于可以替换它,我需要将它链接到AUTH_USER_MODEL.

这很好,models但我有一个基于的表单集User,所以我需要一个我试图填充的表单,如下所示:

from django.forms import ModelForm
from django.forms.models import inlineformset_factory

from optin.models import UserOptin
from django.conf import settings
#from django.contrib.auth.models import User
USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', None) or \
             'auth.User'

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


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

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

这会产生一个错误:

AttributeError:“unicode”对象没有属性“_meta”

这是因为USER_MODEL是一个字符串。我如何将其转换为实际的model

标签: django

解决方案


您可以使用eval()函数,内部解析的所有表达式参数将被评估为 Python 表达式更多信息可以在这里找到

USER_MODEL = eval(getattr(settings, 'AUTH_USER_MODEL', None) or 'auth.User') 
# The fallback will raise an Error here

我建议你 import Userfromdjango.contrib.auth.models 因为,如果AUTH_USER_MODEL没有定义,回退将是auth.User,它不会引发NameError任何模块名称auth,所以你可以使用以下

from django.contrib.auth.models import User
USER_MODEL = eval(getattr(settings, 'AUTH_USER_MODEL', None) or 'User')

推荐阅读