在ModelForm中创建动态字段(Django)

8

如何在运行时创建ModelForm中的字段?

例如,我想创建3个文本框(因为数据库表中有3个条目)

 ID  Name   Value 
------------------
 1   Alpha  10   
 2   Beta   91    
 3   Char   800  

我该如何以这种方式向用户显示它?是否涉及_init定义?在您的模型表单类中循环对象以检索其值并将其转换为要显示的字段是否可行?感谢任何建议。

Alpha
[文本框] ______ Beta
[文本框]
____
等等..
[提交]

这是我在modelform的def init中尝试做的:

self.fields['myfield'].widget = forms.Textarea()

似乎无法给我输出,请注意我的某些Django概念理解不够深入。

3个回答

18

我认为在这种情况下,最好的选择是使用模型表单集

对于任何其他情况,你可以在表单的__init__中将新字段添加到fields属性中。

def __init__(self, *args, *kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields.update({
        'foo': forms.CharField(widget=forms.Textarea()),
        'bar': forms.CharField(widget=forms.Textarea()),
    })

记住,在这种情况下,你必须先调用父类的__init__,这样你才能使用.fields


表单集是这里的简单答案。 - Daniel Roseman

7

您还可以使用django.forms.models.ModelFormMetaclass(由django.forms.models.modelform_​​factory使用)动态定义表单字段。这将创建一个ModelForm类,使用您指定的字段而不是在init中“即时”更新字段。

from django import forms
from django.forms.models import ModelForm, ModelFormMetaclass


model = MyModel
fields = {
    'myfield': forms.CharField(widget=forms.Textarea())
}

meta_attrs = {
    'model': model,
}

Meta = type('Meta', (object, ), meta_attrs)

form_class_attrs = {
    'Meta': Meta, 
}

form_class_attrs.update(fields)

MyModelForm = ModelFormMetaclass('MyModelForm', (ModelForm, ), form_class_attrs)

3

是的,您想要覆盖__init__,做法类似于:

def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    for foo, bar in jelly:
        self.fields[foo] = forms.CharField(widget=forms.Textarea())

在这里可以看到更多相关的IT技术信息这些信息同样适用于ModelForm。


您可以将queryset添加到forms.CharField中,以动态地从数据库检索值。 - vkrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接