10
votes

Comment puis-je modifier les attributs d'un widget dans une méthode de __init __ () de ModelForm?

Je veux modifier de manière programmative les attributs de widget d'un champ dans une méthode init for for for for fort> () de Django Modelform. Jusqu'à présent, j'ai essayé le suivant

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['my_checkbox'].widget_attrs(forms.CheckboxInput(attrs={'onclick':'return false;'}))


0 commentaires

4 Réponses :


21
votes
def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['my_checkbox'].widget.attrs['onclick'] = 'return false;'

4 commentaires

ou, meilleur, attrs ['oncclick'] = 'renvoyer false'


Merci - ça a fonctionné. Une idée de ce que "widget_attrs" est censé faire?


@Daneil, pouvez-vous exposer à ce sujet?


widget_attrs est une méthode de la classe de champ utilisée pour renvoyer les attributs qui doivent être ajoutés au widget, en fonction de la classe de champ actuelle, par exemple. max_length pour Charfields . Vous ne devriez pas écraser la façon dont vous avez essayé de le faire, car il est nécessaire de faire fonctionner le terrain correctement ...



3
votes

La réponse de Bernhard utilisée pour travailler sur 1,7 et avant, mais je ne pouvais pas le faire fonctionner sur 1,8.

Cependant, cela fonctionne: P>

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['my_checkbox'].widget = forms.widgets.Checkbox(attrs={'onclick': 'return false;'})


0 commentaires

1
votes

J'ai rencontré le même problème que James Lin sur Django 1.10, mais je me suis déplacé autour de la mise à jour du dictionnaire attrs code> plutôt que d'attribuer une nouvelle instance de widget. Dans mon cas, je n'ai pas pu garantir la clé d'attribut existant dans le dictionnaire.

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['my_checkbox'].widget.attrs.update({'onclick': 'return false;'})


0 commentaires

0
votes

Je devais faire la même chose, mais pas nécessairement sur l'initialisation. Dans mon cas, je devais configurer un identifiant spécifique pour travailler avec ma fonction Ajax. La réponse était semblable à Kmkttown ci-dessus, mais je n'ai pas utilisé le init fort>, vient de créer une fonction normale dans la classe de formulaire, comme indiqué ci-dessous:

form=YourForm(request.POST or None)
form.type_attr(id_val)


0 commentaires