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

nda*_*nio 6 django django-forms

如何在旅途中在ModelForm中创建字段?

例如,我想创建3个文本框 (because there are 3 entries in the database table)

 ID  Name   Value 
------------------
 1   Alpha  10   
 2   Beta   91    
 3   Char   800  
Run Code Online (Sandbox Code Playgroud)

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

Alpha 

[textbox]
______
Beta

[textbox]

____

etc..

[Submit]

这是我在模型形式的def init中尝试做的事情:

self.fields['myfield'].widget = forms.Textarea()
Run Code Online (Sandbox Code Playgroud)

似乎无法给我输出,请记住我对某些django概念的微弱理解.

emy*_*ler 14

在这种情况下,我认为最好的办法是坚持使用模型表格.对于任何其他情况,您只需fields在表单内的属性中添加新字段即可__init__.

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()),
    })
Run Code Online (Sandbox Code Playgroud)

请记住,在这种情况下,您必须首先调用父__init__项,因此您将拥有.fields可用项.


Max*_*son 5

您还可以使用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)
Run Code Online (Sandbox Code Playgroud)


Hen*_*nry 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())
Run Code Online (Sandbox Code Playgroud)

在这里查看更多信息- 这几乎也适用于 ModelForm。