not - Crear campos dinámicos en ModelForm(Django)
formularios django (3)
Creo que su mejor opción es, en este caso, apegarse a los conjuntos de formularios Model . Para cualquier otro caso, puede agregar nuevos campos al atributo fields
, dentro de __init__
su formulario.
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()),
})
Recuerde que, en este caso, primero debe llamar al __init__
los padres, para que tenga los .fields
disponibles.
¿Cómo creo campos en ModelForm sobre la marcha?
Por ejemplo, quiero crear 3 cuadros de texto (because there are 3 entries in the database table)
ID Name Value
------------------
1 Alpha 10
2 Beta 91
3 Char 800
¿Cómo lo muestro de esta manera al usuario? ¿ Implica la definición _init ? ¿Es posible hacer un bucle for de objetos en su clase de formulario modelo para recuperar sus valores y convertirlos a un campo que se mostrará? Apreciar cualquier sugerencia.
Alpha [textbox] ______ Beta [textbox] ____ etc.. [Submit]
Esto es lo que traté de hacer en la definición de la forma del modelo:
self.fields[''myfield''].widget = forms.Textarea()
Parece que no puede darme el resultado, importa mi débil comprensión de ciertos conceptos de django.
Sí, quieres anular el __init__
, algo como:
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
for foo, bar in jelly:
self.fields[foo] = forms.CharField(widget=forms.Textarea())
Vea mucha más información aquí ; todo se aplica también a ModelForm.
También puede definir dinámicamente campos de formulario utilizando django.forms.models.ModelFormMetaclass
(utilizado por django.forms.models.modelform_factory). Esto creará una clase ModelForm usando los campos que especifique en lugar de actualizar los campos ''sobre la marcha'' en el 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)