Development #64575
possibilité d'un POST pour modifier un seul champ d'une cellule
0%
Description
Pour faire l'édition "front" sur doc-publik.entrouvert.com il y avait ce code,
$('.save').on('click', function() { var csrf = $('[name=csrfmiddlewaretoken]').val(); attr = this.div_zone.edit_url.replace(/^.*(data_textcell.*)\//, 'c$1-text'); var params = {}; params[attr] = this.div_zone.innerHTML; params['csrfmiddlewaretoken'] = csrf; $.post(this.div_zone.edit_url, params).fail(function() { $(this).css('background', 'red'); }); return false; });
Prendre le texte et en faire un POST sur l'url de modification de la cellule.
Avec le passage en onglets il y a davantage de paramètres et ça ne marche plus de juste passer le texte, on obtient en retour une erreur comme quoi le champ visibilité est obligatoire.
C'est peut-être aussi l'occasion de faire un truc plus clean, en posant basiquement djangorestframework ?
Fichiers
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a plus d'un an
- Fichier 0001-manager-add-view-to-edit-a-single-attribute-with-an-.patch 0001-manager-add-view-to-edit-a-single-attribute-with-an-.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Assigné à mis à Frédéric Péters
- Patch proposed changé de Non à Oui
Voilà; l'ambition est uniquement de permettre de restaurer l'édition "front" sur le site de la doc (parce que c'est utile en soit, et pour guider godo #59608), j'ai laissé de côté l'idée de passer par djangorestframework.
Mis à jour par Lauréline Guérin il y a plus d'un an
Là ça marche pour n'importe quel type de cellule, et n'importe quel champ du model, on voudrait pas restreindre un peu ?
Mis à jour par Frédéric Péters il y a plus d'un an
Je trouvais ça bien de laisser générique, même si le cas précis concerne juste l'attibut text des TextCell, sur l'idée qu'éventuellement ça servirait sur quelque chose que je n'imagine pas encore.
Mis à jour par Lauréline Guérin il y a plus d'un an
Ok mais ça permet de bypasser d'éventuels checks des Forms et ModelForms habituellement utilisés. C'est pas gênant ?
Mis à jour par Frédéric Péters il y a plus d'un an
- Fichier 0001-manager-add-view-to-edit-a-single-attribute-with-an-.patch 0001-manager-add-view-to-edit-a-single-attribute-with-an-.patch ajouté
Pour moi on ne permettait pas trop d'éviter les contrôles, j'avais mimé le code sur celui qu'on a dans PageEditCellView,
for tab in self.object.get_manager_tabs(): if tab.get('fields'): tab['form'] = forms.models.modelform_factory( self.object.__class__, fields=tab['fields'] ) form = tab['form'](**self.get_form_kwargs()) if form.is_valid(): self.object = form.save() else: tab_error_forms[tab['slug']] = form response['errorlist'][tab['slug']] = form.errors
mais j'avais raté qu'on avait (bien sûr) des cas sans tab.get('fields')
, avec une classe de formulaire spécifique.
On n'a pas de moyen sûr pour associer un attribut à un onglet pour trouver la classe correspondante, peut-être qu'alors c'est en effet plus prudent de limiter. Mais même en écrivant ça j'hésite, parce que ça m'ennuie de faire quelque chose qui va juste être ok pour les cellules texte, et je me dis que l'appelant ça sera toujours nous et qu'on fera attention.
J'ai modifié dans ce nouveau patch pour 1/ utiliser le form_class donné par l'objet (get_default_form_class) et 2/ vérifier que l'attribut fait partie de ceux retournés par get_default_form_fields(). Ça me semble fournir un milieu adéquat entre tout autoriser et limiter au seul cas actuel.
Mis à jour par Lauréline Guérin il y a plus d'un an
- Statut changé de Solution proposée à Solution validée
Mis à jour par Frédéric Péters il y a plus d'un an
- Statut changé de Solution validée à Résolu (à déployer)
commit cdbb87ecf137ec84f25e88bead3d62a83b407d25 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Sat Sep 10 20:48:43 2022 +0200 manager: add view to edit a single attribute with an ajax request (#64575)
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
manager: add view to edit a single attribute with an ajax request (#64575)