Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Passer des paramètres à un widget dans django

+1 vote

Je suis en train de travailler sur le générateur de formulaires de wagtail, le CRM pour django.
Mon objectif est de passer des paramètres qui affectent le rendu du widget en fonction de requêtes SQL: limiter la possibilité de s'inscrire à des "sessions" à un nombre d'élus, les premiers arrivés.

J'ai codé un LimitedChoiceField, qui prends en choix des valeurs de la forme "valeur:nombre de places", je parse ces valeurs pour n'afficher que "valeur" dans le widget.
Je passe des valeurs sous forme de d'attributs de la classe "widget" à l'initialisation du "field", en ayant pris soin de la copier (deepcopy). Les données interressantes sont passée dans des attrs de classe _choices_max_count et _choices_current_count. (il n'y a pas de **kwargs dans les widgets, c'est con). ces données sont sous la forme {"valeur": count}, resp. pour le
nombre de places utilisée et ne nombre de places maxi, pour chaque "valeur".

Mon widget est un "LimitedRadioSelect", qui a les méthodes qui vont bien pour afficher les choix "disabled" si nécessaire (le radio est affiché, mais grisé et pas cliquable), quand il n'y a plus de places.

Mon problème est le suivant : Si j'ai plusieurs champs LimitedChoiceField dans mon formulaire (dynamique, hein, il est construit à la volée), les données _choices_max_count et _choices_current_count s'emmèlent les pinceaux, je soupsonne le fait que l'attr widget soit un attr de classe dans le Field...

Si c'est pas clair, je posterai un gist sur e sujet demain ;) et si vous avez des pistes, je suis preneur !

demandé 29-Mai par frague (572 points)

Ceci est une auto-réponse : j'ai réussi à faire ce que je voulais, le gist du code est là:

https://gist.github.com/frague59/9c366e0fd59668ceb3ca31ab8aa20748

Finalement, je crée dynamiquement une class qui spécialise mon widget, et le lui passe ses paramètres sous form d'attributs avec la function type() (Ligne 63)

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...