<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Django on Karpoke - Just Another Blog</title><link>http://karpoke.ignaciocano.com/tags/django/</link><description>Recent content in Django on Karpoke - Just Another Blog</description><generator>Hugo -- 0.159.0</generator><language>es</language><lastBuildDate>Mon, 07 Nov 2016 01:17:00 +0100</lastBuildDate><atom:link href="http://karpoke.ignaciocano.com/tags/django/index.xml" rel="self" type="application/rss+xml"/><item><title>Bullet proofing Django models</title><link>http://karpoke.ignaciocano.com/2016/11/07/bullet-proofing-django-models/</link><pubDate>Mon, 07 Nov 2016 01:17:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2016/11/07/bullet-proofing-django-models/</guid><description>&lt;p&gt;Related:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We recently added a bank account like functionality into one of our products.
During the development we encountered some textbook problems and I thought it
can be a good opportunity to go over some of the patterns we use in our
Django models.
This article was written in the order in which we usually address new
problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define the business requirements.&lt;/li&gt;
&lt;li&gt;Write down a naive implementation and model definition.&lt;/li&gt;
&lt;li&gt;Challenge the solution.&lt;/li&gt;
&lt;li&gt;Refine and repeat.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;» Haki Benita | &lt;a href="https://medium.com/@hakibenita/bullet-proofing-django-models-c080739be4e#.pqtppqgoj"&gt;medium.com&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Exclusión de URLs cuando usamos django-debug-toolbar</title><link>http://karpoke.ignaciocano.com/2014/05/15/exclusion-de-urls-cuando-usamos-django-debug-toolbar/</link><pubDate>Thu, 15 May 2014 20:10:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2014/05/15/exclusion-de-urls-cuando-usamos-django-debug-toolbar/</guid><description>&lt;p&gt;&lt;a href="http://github.com/django-debug-toolbar/django-debug-toolbar"&gt;django-debug-toolbar&lt;/a&gt; es una aplicación para Django que nos muestra
información de depuración acerca de las diferentes peticiones y
respuestas que se llevan a cabo en el servidor: variables de contexto,
cabeceras, peticiones SQL, etc.&lt;/p&gt;
&lt;p&gt;Sin embargo, hay algunas URLs para las cuales nos puede interesar que no
se analicen, como por ejemplo, peticiones que se hagan por Ajax o URLs
relativas a diversas aplicaciones instaladas, como el panel de
administración, Rosetta, etc.&lt;/p&gt;</description></item><item><title>Cambiar la contraseña de administrador en Django 1.2</title><link>http://karpoke.ignaciocano.com/2011/02/16/cambiar-la-contrasena-de-administrador-en-django-1-2/</link><pubDate>Wed, 16 Feb 2011 14:11:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/02/16/cambiar-la-contrasena-de-administrador-en-django-1-2/</guid><description>&lt;p&gt;A partir de &lt;a href="https://pythonhosted.org/django_simple_feedback/topics/auth.html#changing-passwords"&gt;Django 1.2&lt;/a&gt; se ha añadido el comando
&lt;code&gt;manage.py changepassword&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ./manage.py changepassword [&amp;#39;username&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si no proporcionamos un nombre de usuario se intentará cambiar el nombre
de usuario que concuerde con el del usuario que ha iniciado sesión. Este
comando nos ahorra escribir lo siguiente:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from django.contrib.auth.models import User
&amp;gt;&amp;gt;&amp;gt; u = User.objects.get(username__exact=&amp;#39;john&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; u.set_password(&amp;#39;new password&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; u.save()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="Django Admin Login" loading="lazy" src="http://karpoke.ignaciocano.com/images/django-admin-login-300x171.png"&gt;&lt;/p&gt;
&lt;p&gt;El usuario administrador es el primer usuario del sistema por lo que
podemos escribir:&lt;/p&gt;</description></item><item><title>Buscar en todos los campos de un modelo en Django</title><link>http://karpoke.ignaciocano.com/2010/11/19/buscar-en-todos-los-campos-de-un-modelo-en-django/</link><pubDate>Fri, 19 Nov 2010 20:49:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/11/19/buscar-en-todos-los-campos-de-un-modelo-en-django/</guid><description>&lt;p&gt;Una acción típica que se va a repetir en, prácticamente, cada listado
que mostremos, es la de añadir un buscador [1]. Un buscador típico
incluirá un pequeño formulario en la misma página de listado:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;form method=&amp;#34;get&amp;#34; action=&amp;#34;&amp;#34;&amp;gt;
&amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;q&amp;#34; value=&amp;#34;{{ q }}&amp;#34; /&amp;gt;
&amp;lt;input type=&amp;#34;submit&amp;#34; value=&amp;#34;Search&amp;#34; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nos interesaría no tener que ir copiando y pengando este código en cada
listado. Aunque sea un código que no vaya a cambiar, viola el principio
de DRY.&lt;/p&gt;</description></item><item><title>Control de concurrencia optimista en Django</title><link>http://karpoke.ignaciocano.com/2010/11/05/control-de-concurrencia-optimista-en-django/</link><pubDate>Fri, 05 Nov 2010 18:11:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/11/05/control-de-concurrencia-optimista-en-django/</guid><description>&lt;p&gt;Si tenemos una aplicación multiusuario, podría darse el caso de que dos
usuarios accediesen simultáneamente al mismo registro para editarlo. Si
no controlamos este evento, sucederá que el primero que guarde, que no
tiene porqué ser el primero que comenzó a editar, perderá los cambios, y
lo que es peor, sin enterarse.&lt;/p&gt;
&lt;p&gt;Una solución sería utilizar &lt;a href="http://docs.djangoproject.com/en/dev/topics/db/transactions/"&gt;transacciones&lt;/a&gt; [1], pero éstas deberían
abarcar varias peticiones HTTP, desde que se empieza a editar hasta que
se guarda satisfactoriamente (o no), con lo que la solución idónea se
complica. Una solución más sencilla, pero efectiva en la inmensa mayoría
de casos, es utilizar el &lt;a href="http://stackoverflow.com/questions/320096/django-how-can-i-protect-against-concurrent-modification-of-data-base-entries"&gt;control de concurrencia optimista&lt;/a&gt; (también
comentado en &lt;a href="http://hardware.slashdot.org/comments.pl?sid=1381511&amp;amp;cid=29536367"&gt;slashdot&lt;/a&gt;).&lt;/p&gt;</description></item><item><title>Actualización recursiva de un diccionario en Python</title><link>http://karpoke.ignaciocano.com/2010/09/28/actualizacion-recursiva-de-un-diccionario-en-python/</link><pubDate>Tue, 28 Sep 2010 13:50:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/09/28/actualizacion-recursiva-de-un-diccionario-en-python/</guid><description>&lt;p&gt;Cuando actualizamos un diccionario con otro en Pyhton, el método &lt;code&gt;update&lt;/code&gt; copia
las entradas del diccionario fuente en el diccionario destino, sobreescribiendo
las de éste si la entrada existe en ambos diccionarios.&lt;/p&gt;
&lt;p&gt;En particular, si un diccionario contiene una entrada que es a su vez otro
diccionario, no se realiza una actualización sobre ésta, por lo que se pierden
los valores que no estuvieran en el diccionario fuente.&lt;/p&gt;
&lt;p&gt;Ilustremos este comportamiento con un ejemplo:&lt;/p&gt;</description></item></channel></rss>