7
votes

Créer des champs dynamiques dans Modelform (Django)

Comment créer des champs dans modelform sur le go?

Par exemple, je souhaite créer 3 textboxes (car il y a 3 entrées dans la table de base de données) code> p>

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


0 commentaires

3 Réponses :


3
votes

Oui, vous voulez remplacer le __ init __ , quelque chose comme: xxx

Voir lots plus info ICI - Tout s'applique pas à Modelform.


1 commentaires

Vous pouvez ajouter QuerySet sur les formulaires.charfield pour récupérer les valeurs de la base de données de manière dynamique.



16
votes

Je pense que votre meilleur pari est, dans ce cas, de coller à Forms Formsets . Pour tout autre cas, vous pouvez simplement ajouter de nouveaux champs à l'attribut code> code>, à l'intérieur de votre formulaire __ init __ code>.

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()),
    })


1 commentaires

Les constructeurs automatiques sont la réponse simple ici.



7
votes

Vous pouvez également définir de manière dynamique des champs de formulaire à l'aide du django.forms.models.modelormmetaclass code> (utilisé par django.forms.models.modelform_factory). Cela créera une classe Modelform à l'aide des champs que vous spécifiez plutôt que de mettre à jour les champs 'de la mouche' dans l'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)


0 commentaires