<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: A response to Dropping Django</title>
	<atom:link href="http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/feed/" rel="self" type="application/rss+xml" />
	<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/</link>
	<description>Building Amazing Webapps</description>
	<lastBuildDate>Sat, 13 Mar 2010 00:26:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Brandon Bloom</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-2/#comment-2144</link>
		<dc:creator>Brandon Bloom</dc:creator>
		<pubDate>Tue, 25 Aug 2009 06:07:11 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2144</guid>
		<description>&lt;p&gt;I posted some sample code for my URL routing solution:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.brandonbloom.name/2009/08/url-routing-and-views.html&quot; rel=&quot;nofollow&quot;&gt;
http://blog.brandonbloom.name/2009/08/url-routing-and-views.html&lt;/a&gt;&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I posted some sample code for my URL routing solution:</p>

<p><a href="http://blog.brandonbloom.name/2009/08/url-routing-and-views.html" rel="nofollow">
</a><a href="http://blog.brandonbloom.name/2009/08/url-routing-and-views.html" rel="nofollow">http://blog.brandonbloom.name/2009/08/url-routing-and-views.html</a></p>]]></content:encoded>
	</item>
	<item>
		<title>By: Cornelis</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-2/#comment-2136</link>
		<dc:creator>Cornelis</dc:creator>
		<pubDate>Mon, 24 Aug 2009 08:55:48 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2136</guid>
		<description>&lt;p&gt;I do agree with Andrew, although I&#039;m still sticking with the Django template language. On several occasions I have to access filtered related records for the current object. I have to write a separate tag for that every time with all the maintenance overhead attached were it would take three lines of template code if Django would only allow object.related_set.filter(whatever) instead of only object.related_set.all inside templates.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I do agree with Andrew, although I&#8217;m still sticking with the Django template language. On several occasions I have to access filtered related records for the current object. I have to write a separate tag for that every time with all the maintenance overhead attached were it would take three lines of template code if Django would only allow object.related_set.filter(whatever) instead of only object.related_set.all inside templates.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Andrew Ingram</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2107</link>
		<dc:creator>Andrew Ingram</dc:creator>
		<pubDate>Fri, 21 Aug 2009 08:41:47 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2107</guid>
		<description>&lt;p&gt;By switching to jinja2, you lose generic views. You also can&#039;t use another template language to extend existing templates - like the django admin templates.&lt;/p&gt;

&lt;p&gt;So far at work, despite having a dedicated designer, the programmers have been building all the templates and here&#039;s why:&lt;/p&gt;

&lt;p&gt;A template author has to understand the dot notation for traversing the object tree, this means they need to KNOW the object tree and how it works in relation to the dot notation. Say I have a variable &#039;n&#039;, and I want to access the nth object in an array &#039;foo&#039; in the template, a designer might incorrectly try to access foo.n, instead they&#039;d have to ask the programmers to write a filter so they can write foo&#124;arrayget:n or something similar. When in jinja2 you can just write foo[n].&lt;/p&gt;

&lt;p&gt;Whenever a template designer needs to access a method on an object that would normally take parameters, they have to either ask the coder to refactor the context and models or to write a custom tag (which is a very untidy process). This seems to be doing the opposite of seperating design from presentation - I&#039;ve found myself adding numerous methods to my models and hacking getattr simply for the purpose of making some small template use cases possible.&lt;/p&gt;

&lt;p&gt;Just because something is in a template, it doesn&#039;t mean it doesn&#039;t need advanced logic. A template designer using Django is going to have to get their toes wet with Python as soon as they start doing anything beyond a very simple blog app.&lt;/p&gt;

&lt;p&gt;Now here&#039;s the kicker: The Django template language is no easier to learn than Python (because Python is famous for its readability and ease of use/learning), but it does introduce a horrendous stack trace for debugging, an unneccessay burden on the programmers to modify context, and write filters or tags. Not to forget the godawful syntax for conditionals, just to get around writing an equality in Python.&lt;/p&gt;

&lt;p&gt;The reason jinja2 is nice is that it&#039;s superficially a superset of Django&#039;s own template language, a template designer can use the designer-friendly syntax as far as possible - but dip into the &#039;advanced&#039; syntax for those rare occasions when they need something more.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>By switching to jinja2, you lose generic views. You also can&#8217;t use another template language to extend existing templates &#8211; like the django admin templates.</p>

<p>So far at work, despite having a dedicated designer, the programmers have been building all the templates and here&#8217;s why:</p>

<p>A template author has to understand the dot notation for traversing the object tree, this means they need to KNOW the object tree and how it works in relation to the dot notation. Say I have a variable &#8216;n&#8217;, and I want to access the nth object in an array &#8216;foo&#8217; in the template, a designer might incorrectly try to access foo.n, instead they&#8217;d have to ask the programmers to write a filter so they can write foo|arrayget:n or something similar. When in jinja2 you can just write foo[n].</p>

<p>Whenever a template designer needs to access a method on an object that would normally take parameters, they have to either ask the coder to refactor the context and models or to write a custom tag (which is a very untidy process). This seems to be doing the opposite of seperating design from presentation &#8211; I&#8217;ve found myself adding numerous methods to my models and hacking getattr simply for the purpose of making some small template use cases possible.</p>

<p>Just because something is in a template, it doesn&#8217;t mean it doesn&#8217;t need advanced logic. A template designer using Django is going to have to get their toes wet with Python as soon as they start doing anything beyond a very simple blog app.</p>

<p>Now here&#8217;s the kicker: The Django template language is no easier to learn than Python (because Python is famous for its readability and ease of use/learning), but it does introduce a horrendous stack trace for debugging, an unneccessay burden on the programmers to modify context, and write filters or tags. Not to forget the godawful syntax for conditionals, just to get around writing an equality in Python.</p>

<p>The reason jinja2 is nice is that it&#8217;s superficially a superset of Django&#8217;s own template language, a template designer can use the designer-friendly syntax as far as possible &#8211; but dip into the &#8216;advanced&#8217; syntax for those rare occasions when they need something more.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Mads Sülau Jørgensen</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2106</link>
		<dc:creator>Mads Sülau Jørgensen</dc:creator>
		<pubDate>Fri, 21 Aug 2009 08:09:56 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2106</guid>
		<description>&lt;p&gt;The django admin actually does auth against email, but only if you write in your email in the username field, and only if there is only 1 user with that email. It&#039;ll tell you, that you cannot login with your email, if no or &gt;1 users with that email exists.&lt;/p&gt;

&lt;p&gt;It&#039;s some tricky business.&lt;/p&gt;

&lt;p&gt;http://code.djangoproject.com/browser/django/tags/releases/1.1/django/contrib/admin/views/decorators.py#L58&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>The django admin actually does auth against email, but only if you write in your email in the username field, and only if there is only 1 user with that email. It&#8217;ll tell you, that you cannot login with your email, if no or &gt;1 users with that email exists.</p>

<p>It&#8217;s some tricky business.</p>

<p><a href="http://code.djangoproject.com/browser/django/tags/releases/1.1/django/contrib/admin/views/decorators.py#L58" rel="nofollow">http://code.djangoproject.com/browser/django/tags/releases/1.1/django/contrib/admin/views/decorators.py#L58</a></p>]]></content:encoded>
	</item>
	<item>
		<title>By: Vinay Sajip</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2105</link>
		<dc:creator>Vinay Sajip</dc:creator>
		<pubDate>Fri, 21 Aug 2009 07:37:45 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2105</guid>
		<description>&lt;p&gt;Doing auth checks in the render phase seems like an anti-pattern to me - a lot of work may have been done getting data for the response. Instead, the check should be done at the start of the view, and perhaps syntactically sugared with a suitable decorator (similar to &lt;em&gt;login_required&lt;/em&gt;).&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Doing auth checks in the render phase seems like an anti-pattern to me &#8211; a lot of work may have been done getting data for the response. Instead, the check should be done at the start of the view, and perhaps syntactically sugared with a suitable decorator (similar to <em>login_required</em>).</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Django from the trenches &#171; Life Less Measured</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2104</link>
		<dc:creator>Django from the trenches &#171; Life Less Measured</dc:creator>
		<pubDate>Fri, 21 Aug 2009 07:17:02 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2104</guid>
		<description>&lt;p&gt;[...] morning to an email from one of my colleagues asking me for my opinion on Shabda&#8217;s article A response to Dropping Django. The article makes some interesting points and re-affirms my opinion of Shabda as a top-notch [...]&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>[...] morning to an email from one of my colleagues asking me for my opinion on Shabda&#8217;s article A response to Dropping Django. The article makes some interesting points and re-affirms my opinion of Shabda as a top-notch [...]</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Andrew Shultz</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2098</link>
		<dc:creator>Andrew Shultz</dc:creator>
		<pubDate>Thu, 20 Aug 2009 21:56:29 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2098</guid>
		<description>&lt;p&gt;I know a friend of mine is getting around the email for username thing by assigning a fake username (generating a UUID for it) and then making the login form take email and password instead of usename and password.  He did a lot of authentication customization (including LDAP integration) in the configuration tool we worked on together in django as well.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I know a friend of mine is getting around the email for username thing by assigning a fake username (generating a UUID for it) and then making the login form take email and password instead of usename and password.  He did a lot of authentication customization (including LDAP integration) in the configuration tool we worked on together in django as well.</p>]]></content:encoded>
	</item>
	<item>
		<title>By: A response to Dropping Django — The Uswaretech Blog - Django Web Development &#171; Netcrema - creme de la social news via digg + delicious + stumpleupon + reddit</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2095</link>
		<dc:creator>A response to Dropping Django — The Uswaretech Blog - Django Web Development &#171; Netcrema - creme de la social news via digg + delicious + stumpleupon + reddit</dc:creator>
		<pubDate>Thu, 20 Aug 2009 20:35:38 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2095</guid>
		<description>&lt;p&gt;[...] A response to Dropping Django — The Uswaretech Blog - Django Web Developmentuswaretech.com [...]&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>[...] A response to Dropping Django — The Uswaretech Blog &#8211; Django Web Developmentuswaretech.com [...]</p>]]></content:encoded>
	</item>
	<item>
		<title>By: Brandon Bloom</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2093</link>
		<dc:creator>Brandon Bloom</dc:creator>
		<pubDate>Thu, 20 Aug 2009 20:28:12 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2093</guid>
		<description>&lt;p&gt;Hi Shabda,&lt;/p&gt;

&lt;p&gt;Several others have shown interest in our approach URL routing to authorization. It seems I wasn&#039;t clear enough about how or why our system works. Your solutions don’t fit our needs exactly. What I came up with isn’t much more complex than what you’ve got. I&#039;ll try to write a follow-up post within the next week or two.&lt;/p&gt;

&lt;p&gt;In short, my stance on the template language debate is: we don&#039;t have dedicated designers and we don&#039;t expect to have any soon. Django wasn&#039;t made for programmers, so we&#039;re using something that was.&lt;/p&gt;

&lt;p&gt;As for username authentication, the problem is that the default User model and schema enforce a unique, not-null constraint. &lt;i&gt;All&lt;/i&gt; users must have a username. It is far from an insurmountable problem: I overrode the save function, called super.save, set username = id, then called save again.&lt;/p&gt;

&lt;p&gt;I didn&#039;t always just throw out Django, I made it work for me. In some cases, it was faster, easier, and produced better results to just rewrite things. I was always picking the path of least resistance.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;/p&gt;

&lt;p&gt;-Brandon&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Hi Shabda,</p>

<p>Several others have shown interest in our approach URL routing to authorization. It seems I wasn&#8217;t clear enough about how or why our system works. Your solutions don’t fit our needs exactly. What I came up with isn’t much more complex than what you’ve got. I&#8217;ll try to write a follow-up post within the next week or two.</p>

<p>In short, my stance on the template language debate is: we don&#8217;t have dedicated designers and we don&#8217;t expect to have any soon. Django wasn&#8217;t made for programmers, so we&#8217;re using something that was.</p>

<p>As for username authentication, the problem is that the default User model and schema enforce a unique, not-null constraint. <i>All</i> users must have a username. It is far from an insurmountable problem: I overrode the save function, called super.save, set username = id, then called save again.</p>

<p>I didn&#8217;t always just throw out Django, I made it work for me. In some cases, it was faster, easier, and produced better results to just rewrite things. I was always picking the path of least resistance.</p>

<p>Cheers,</p>

<p>-Brandon</p>]]></content:encoded>
	</item>
	<item>
		<title>By: dude</title>
		<link>http://uswaretech.com/blog/2009/08/a-response-to-dropping-django/comment-page-1/#comment-2091</link>
		<dc:creator>dude</dc:creator>
		<pubDate>Thu, 20 Aug 2009 19:43:34 +0000</pubDate>
		<guid isPermaLink="false">http://uswaretech.com/blog/?p=662#comment-2091</guid>
		<description>&lt;p&gt;DAMN Python is fugly.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>DAMN Python is fugly.</p>]]></content:encoded>
	</item>
</channel>
</rss>
