{"id":5437,"date":"2018-07-26T13:03:24","date_gmt":"2018-07-26T18:03:24","guid":{"rendered":"https:\/\/islascruz.org\/blog\/?p=5437"},"modified":"2018-07-26T18:19:34","modified_gmt":"2018-07-26T23:19:34","slug":"tips-tricks-django-mostrar-cierto-contenido-seleccionado-en-choicefield","status":"publish","type":"post","link":"https:\/\/islascruz.org\/blog\/2018\/07\/26\/tips-tricks-django-mostrar-cierto-contenido-seleccionado-en-choicefield\/","title":{"rendered":"Tips and tricks: Django &#8211; Mostrar cierto contenido seleccionado en un ChoiceField"},"content":{"rendered":"<p>Si hemos usado Django seguro nos hemos enamorado de su forma de hacer formularios, sobre todo los que est\u00e1n relacionados con un modelo, puesto que son simpl\u00edsimos. Hay que reconocer lo simple de Django, y gracias a esta simplicidad que no busca satisfacer completamente todas las necesidades podemos encontrarnos con situaciones que pues, no se apegan a lo que queremos hacer.<\/p>\n<p><!--more--><\/p>\n<p>[amazon_link asins=&#8217;B009YLRYMI,B076QH5FB2,020161622X&#8217; template=&#8217;ProductCarousel&#8217; store=&#8217;launocom-20&#8242; marketplace=&#8217;MX&#8217; link_id=&#8217;98962281-912a-11e8-b0f1-a75c5f8f4964&#8242;]<\/p>\n<p>Una de ellas es mostrar cierto contenido en un ChoiceField, es decir, un &#8220;SELECT&#8221;. Si nuestro formulario esta asociado a un modelo y este ChoiceField es un ForeingKey a otro modelo al momento de mostrarlo en nuestro formulario lo que har\u00e1 es mostrar todo lo que hay en ese modelo.<\/p>\n<p>Como hacer entonces que no se muestre todo sino solo la parte que me interesa?.<\/p>\n<p>Bien, sabemos que el los campos dentro de un <code>ModelForm<\/code> \u00a0se guardan en la propiedad <code>fields<\/code>que es b\u00e1sicamente un diccionario, cada campo es una llave en dicho diccionario y cada campo es en si un objeto del que despu\u00e9s se tomara su representaci\u00f3n HTML para imprimirla en la plantilla, pero hasta antes de la plantilla podemos cambiar par\u00e1metros.\u00a0Por ejemplo, la propiedad <code>choices<\/code>\u00a0de <code>forms.ChoiceField<\/code>\u00a0.<\/p>\n<p>El cambio lo podemos aplicar en el m\u00e9todo <strong>init<\/strong> y podemos incluso pasar el par\u00e1metro de lo que queremos que se muestre en dicho <code>ChoiceField<\/code>\u00a0, supongamos entonces<\/p>\n<p>&nbsp;<\/p>\n<pre>form django import forms\nfrom models import Departamento \n\nclass AddUserForm(forms.ModelForm):\n    \"\"\"Add a user\"\"\"\n\n    first_name = forms.CharField(label=\"Nombres\")\n    last_name = forms.CharField(label=\"Apellidos\")\n    email = forms.EmailField(label=\"Correo elecr\u00f3nico\")\n    username = forms.CharField(label=\"Nombre de usuario\")\n    password = forms.CharField(label=\"Contrase\u00f1a\")\n    departamento = forms.ChoiceField(label=\"Departamento\", \n            widget=forms.widgets.Select())\n\n    def __init__(self, post=None, files=None, instance=None, departamentos=None):\n        \"\"\"Initialize the form\"\"\"\n        # Ejecutamos Super para correr el inicializador de forms.ModelForm\n        # Esto generar\u00e1 self.fields\n        super(AddUserForm, self).__init__(post, files, instance)\n        if departamentos:\n            # Como en el modelo, \"choices\" es una tupla de tuplas\n            # ((id, texto), (id, texto), (id, texto))\n            self.fields[\"departamento\"].choices = departamentos\n\n<\/pre>\n<p>De esta forma estamos haciendo que el formulario, en el campo <code>Departamento<\/code>\u00a0muestre las opciones que nosotros queremos.<\/p>\n<p>As\u00ed como esto, podemos hacer otras cosas, por ejemplo, borrar campos:<\/p>\n<p>&nbsp;<\/p>\n<pre>    def __init__(self, post=None, files=None, instance=None, departamentos=None,\n            display_username=True):\n        \"\"\"Initialize the form\"\"\"\n        # Ejecutamos Super para correr el inicializador de forms.ModelForm\n        # Esto generar\u00e1 self.fields\n        super(AddUserForm, self).__init__(post, files, instance)\n        if not display_username: \n            # Removemos el campo \"username\" para que el usuario no lo \n            # modifique en una edici\u00f3n.\n            self.fields.pop(\"username\")\n<\/pre>\n<p>O modificar el valor inicial de un campo:<\/p>\n<pre> if instance:\n        self.fields[\"departamento\"].initial = 3\n        if not instance.email:\n            self.fields.email.initial = \"email@defecto.com\"\n\n<\/pre>\n<div>\n<hr \/>\n<\/div>\n<div>Si te gust\u00f3 el articulo, comparte\u00a0en tus redes sociales, si tienes algo \u00a0que agregar con toda confianza hazlo en los comentarios.<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5437\" class=\"pvc_stats all  \" data-element-id=\"5437\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/islascruz.org\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Si hemos usado Django seguro nos hemos enamorado de su forma de hacer formularios, sobre todo los que est\u00e1n relacionados con un modelo, puesto que son simpl\u00edsimos. Hay que reconocer lo simple de Django, y gracias a esta simplicidad que no busca satisfacer completamente todas las necesidades podemos encontrarnos con situaciones que pues, no se [&hellip;]<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_5437\" class=\"pvc_stats all  \" data-element-id=\"5437\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/islascruz.org\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":5439,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[162,14,15,239],"tags":[992,565,991,16],"class_list":["post-5437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-espanol","category-programming","category-python","category-tips-and-tricks","tag-choicefield","tag-django","tag-modelform","tag-python-2"],"brizy_media":[],"_links":{"self":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/comments?post=5437"}],"version-history":[{"count":7,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5437\/revisions"}],"predecessor-version":[{"id":5447,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/posts\/5437\/revisions\/5447"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/media\/5439"}],"wp:attachment":[{"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/media?parent=5437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/categories?post=5437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/islascruz.org\/blog\/wp-json\/wp\/v2\/tags?post=5437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}