2 votes

web2py : modifier le widget dans le formulaire crud

J'ai un formulaire CRUD qui possède un widget de sélection. Les options du widget sont dynamiques. Je ne peux pas utiliser de balises, car les valeurs proviennent d'autres tables. J'essaie de modifier les valeurs dans le contrôleur en utilisant cette méthode :

def change_widget(form, id, widget):
"Tries to find a widget in the given form with the given id and swaps it with the given widget"
for i in range( len(form[0].components) ):
    if hasattr(form[0].components[i].components[1].components[0], 'attributes'):
        if '_id' in form[0].components[i].components[1].components[0].attributes:
            if form[0].components[i].components[1].components[0].attributes['_id'] == id:
                form[0].components[i].components[1].components[0] = widget
                return True

return False

Après avoir appelé la méthode et inspecté le formulaire, je peux voir que le formulaire a été modifié avec succès. Du côté de la vue, j'utilise une vue personnalisée et j'essaie d'afficher le formulaire comme suit :

{{=form.custom.begin}} {{=form.custom.widget.customized_field}}
{{=form.custom.submit}} {{=form.custom.end}}

Mais le widget original non modifié est toujours affiché. Qu'est-ce que je fais de mal ? Existe-t-il une meilleure façon de procéder ?

4voto

Anthony Points 11798

Tout d'abord, voici un moyen beaucoup plus simple de remplacer le widget :

form.element(_id=id).parent[0] = widget

Toutefois, étant donné que vous remplacez complètement le widget d'origine par un nouvel objet widget plutôt que de simplement modifier le widget d'origine, form.custom.widget.customized_field fera toujours référence au widget d'origine. Vous devez donc remplacer explicitement form.custom.widget.customized_field également. Essayez :

def change_widget(form, name, widget):
    form.element(_name=name).parent[0] = form.custom.widget[name] = widget

name est le nom du champ.

Ver aquí pour en savoir plus sur la recherche dans le DOM côté serveur.

Notez également que vous pouvez spécifier un widget personnalisé pour le champ avant même la création du formulaire, soit dans la définition du tableau, soit après :

db.define_table('mytable', Field('myfield', widget=custom_widget))

ou

db.mytable.myfield.widget = custom_widget

Ensuite, lorsque vous créez un formulaire, le widget personnalisé sera utilisé plutôt que le widget par défaut.

Ver aquí pour en savoir plus sur les widgets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X