【问题标题】:How to pass variables from __init__ to Meta class in Django如何将变量从 __init__ 传递到 Django 中的 Meta 类
【发布时间】:2020-12-01 10:00:56
【问题描述】:

我正在尝试从数据库中的列创建动态表单。 每个表的列都不同,但我必须能够添加一个表,然后 Django 需要能够创建一个表单来插入新值,而无需修改代码。

views.py

def add_entry(request, partname):
    partname = partname.replace('_', ' ').title().replace(' ', '')

    form = AddPartForm(request.POST, model=partname)

    context = {'form': form}
    return render(request, 'index.html', context)

将模型从 views.py 传递到 forms.py 的工作方式类似于

class AddPartForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.model = kwargs.pop('model')
        super(AddPartForm, self).__init__(*args, **kwargs)

问题是我收到以下错误:

ValueError: ModelForm has no model class specified.

我似乎无法将该模型变量传递给 Meta 类。

有没有办法做到这一点,或者我应该以不同的方式处理它?

【问题讨论】:

    标签: python django django-views django-forms


    【解决方案1】:

    我也有同样的需求,通过动态构造表单类解决了:

    def get_modelform(name, model, baseclass):
        meta = type('Meta', (), { "model":model})
        return type(name, (baseclass,), {"Meta": meta})
    

    那么你必须这样改变你的观点:

    from django.apps import AppConfig
        def add_entry(request, partname):
            partname = partname.replace('_', ' ').title().replace(' ', '')
            model = AppConfig.get_model('yourapp', partname)
            form = get_modelform('AddPartForm', model, forms.ModelForm)(request.POST)
            context = {'form': form}
            return render(request, 'index.html', context)
    

    【讨论】:

    • 我对你的代码感到困惑,听起来它应该可以工作,但我得到了同样的错误。你能更具体一点还是我遗漏了什么?
    猜你喜欢
    • 2012-01-22
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2018-06-01
    • 2013-11-27
    • 2018-02-17
    • 2021-10-15
    相关资源
    最近更新 更多