{"id":2831,"date":"2018-07-28T22:22:26","date_gmt":"2018-07-28T20:22:26","guid":{"rendered":"https:\/\/j-mad.com\/blog\/?p=2831"},"modified":"2018-07-28T22:22:26","modified_gmt":"2018-07-28T20:22:26","slug":"configurer-les-representations-textuelles-qui-seront-utilisees-dans-les-choicefield-des-forms-django","status":"publish","type":"post","link":"https:\/\/j-mad.com\/blog\/2018\/07\/28\/configurer-les-representations-textuelles-qui-seront-utilisees-dans-les-choicefield-des-forms-django\/","title":{"rendered":"Configurer les repr\u00e9sentations textuelles qui seront utilis\u00e9es dans les ChoiceField des forms Django."},"content":{"rendered":"<p>Longtemps que je n\u2019avais pas post\u00e9 de billets dans cette partie du blog. (Vous allez me dire longtemps que je n\u2019ai pas post\u00e9 de billet tout court, et vous auriez raison, mais ma bonne r\u00e9solution de fin de vacances d\u2019\u00e9t\u00e9 est de changer cela).<\/p>\n<p>Mais donc, pour reprendre doucement dans la partie technique, je vais commencer par partager un truc que tout le monde conna\u00eet s\u00fbrement d\u00e9j\u00e0. Sauf que perso, j\u2019oublie \u00e0 chaque fois que cette fonctionnalit\u00e9 de django existe et donc je gal\u00e8re pour la retrouver. Du coup je me dis qu\u2019en l\u2019\u00e9crivant je finirais par la m\u00e9moriser (et donc en fait j\u2019\u00e9cris plus pour moi qu\u2019autre chose, je suis un vilain\u00a0!:) ).<\/p>\n<p>Donc imaginons que vous avez un mod\u00e8le. Truc assez classique. Ce mod\u00e8le vous lui avez d\u00e9fini une repr\u00e9sentation textuelle de base avec <strong>str<\/strong> . Sauf que vous avez plusieurs forms, donc certains ont des ChoiceFields utilisant ce mod\u00e8le (Exemple un mod\u00e8le User et vous avez un mod\u00e8le Post o\u00f9 vous devez choisir le r\u00e9dacteur du billet). Et manque de chance, vous avez besoin d\u2019une repr\u00e9sentation textuelle diff\u00e9rentes de celle de base pour un de vos forms. O\u00f9 m\u00eame pire, vous avez besoin de plusieurs repr\u00e9sentations textuelles diff\u00e9rentes, pour plein de forms diff\u00e9rents.<\/p>\n<p>Vous \u00eates alors bien marri.<\/p>\n<p>Mais en fait non, parce que Django vous fourni une fa\u00e7on \u00e0 la fois simple et \u00e9l\u00e9gante de faire. A chaque fois que vous aurez besoin d\u2019une repr\u00e9sentation textuelle qui ne soit pas celle par d\u00e9faut, il vous suffira de d\u00e9finir une classe d\u00e9rivant de ModelChoiceField et qui impl\u00e9mentera la m\u00e9thode label_from_instance. Cette m\u00e9thode prend comme unique param\u00e8tre l\u2019objet qui doit voir sa repr\u00e9sentation textuelle d\u00e9finit et renvoie une cha\u00eene de caract\u00e8re.<\/p>\n<p>Petit exemple tir\u00e9 de la doc django\u00a0:<\/p>\n<div class=\"codecolorer-container python default\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><div class=\"python codecolorer\"><span class=\"kw1\">from<\/span> django.<span class=\"me1\">forms<\/span> <span class=\"kw1\">import<\/span> ModelChoiceField<br \/>\n<br \/>\n<span class=\"kw1\">class<\/span> MyModelChoiceField<span class=\"br0\">&#40;<\/span>ModelChoiceField<span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">def<\/span> label_from_instance<span class=\"br0\">&#40;<\/span><span class=\"kw2\">self<\/span><span class=\"sy0\">,<\/span> obj<span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;My Object #%i&quot;<\/span> % obj.<span class=\"kw2\">id<\/span><\/div><\/div>\n<p>Voil\u00e0. Aussi simple que cela. Vous n\u2019avez plus qu\u2019\u00e0 utiliser votre classe fille de ModelChoiceField dans votre formulaire et le tour et jou\u00e9.<\/p>\n<p>Bonus, \u00e7a marche aussi pour les MultipleChoiceField, il faudra simplement d\u00e9finir une classe fille de ModelMultipleChoiceField<\/p>\n<p>et le lien vers la doc qui parle de tout cela\u00a0: <a href=\"http:\/\/(https:\/\/docs.djangoproject.com\/fr\/2.0\/ref\/forms\/fields\/\">(https:\/\/docs.djangoproject.com\/fr\/2.0\/ref\/forms\/fields\/<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Longtemps que je n\u2019avais pas post\u00e9 de billets dans cette partie du blog. (Vous allez me dire longtemps que je n\u2019ai pas post\u00e9 de billet tout court, et vous auriez raison, mais ma bonne r\u00e9solution de fin de vacances d\u2019\u00e9t\u00e9 est de changer cela). Mais donc, pour reprendre doucement dans la partie technique, je vais &hellip; <a href=\"https:\/\/j-mad.com\/blog\/2018\/07\/28\/configurer-les-representations-textuelles-qui-seront-utilisees-dans-les-choicefield-des-forms-django\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Configurer les repr\u00e9sentations textuelles qui seront utilis\u00e9es dans les ChoiceField des forms Django.<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[],"class_list":["post-2831","post","type-post","status-publish","format-standard","hentry","category-django"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p12cdp-JF","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/2831","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/comments?post=2831"}],"version-history":[{"count":2,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/2831\/revisions"}],"predecessor-version":[{"id":2833,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/posts\/2831\/revisions\/2833"}],"wp:attachment":[{"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/media?parent=2831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/categories?post=2831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/j-mad.com\/blog\/wp-json\/wp\/v2\/tags?post=2831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}