( os.path.join(SITE_ROOT, 'templates'),)Hardcode em templatesNos templates, tambem e possivel ver hardcodes nos caminhos de links, imagens, javascript e css.Embora seja muito tentador (pois e mais rapido) utilizar este caminho, e bem melhor voce utilizar a variavel MEDIA_URL que foi declarada no settings.py, dentro do seu template. Como fazer isso? Adicione um context processor!TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.request',"django.core.context_processors.auth","django.core.context_processors.debug","django.core.context_processors.i18n","django.core.context_processors.media")Os Context processors, falando a grosso modo, adicionam itens dentro dos templates. Como visto acima, o Django possui uma serie de processors, para as mais variadas funcionalidades (autenticacao, debug, internacionalizacao, etc...)O context processor django.core.context_processors.media adiciona uma variavel nos templates chamada MEDIA_URL, ela possui o caminho especificado na constante MEDIA_URL do settings.py, dessa forma ao inves de chamar um css assim:voce chama assim:Fica mais bonito? Talvez nao, mas vai facilitar a sua manutencao! Isso vai :)Hardcode em linksVamos direto a um exemplo mais pratico:Digamos que voce tem uma aplicacao que exibe os seus produtos:from django.conf.urls.defaults import *urlpatterns = patterns('produtos.views', (r'^$', 'inicio',), (r'^cadastro/$', 'cadastro'), (r'^(?P\d+)/$', 'detalhe'), (r'^(?P\d+)/comprar/$', 'comprar'), (r'^carrinho/$', 'carrinho'),)Ate a versao 1.0 do Django o modo de exibir estas urls e colocando o endereco absoluto dela direto no template, algo como:<a href="/produtos/">Lista</a> - <a href="/produtos/cadastro">Novo</a> - <a href="/carrinho/">Carrinho de compras</a><ul>{%for p in produtos%}<li><a href="/produtos/{{p.id}}/">{{p.nome}}</a></li>{%endfor%} </ul>Mas, e se por algum motivo, a secao de produto nao estiver em /produtos/ e sim em um outro endereco qualquer? Teremos que alterar "no braco" qualquer vestigio nos templates, caso contrario, enviaremos um erro 404 para o usuario!Ainda bem, que apos a versao 1.0 do Django possuimos urls nomeadas! dessa forma podemos construir nossas urls da seguinte maneira:from django.conf.urls.defaults import *urlpatterns = patterns('produtos.views', url(r'^$', 'inicio', name='produto-home'), url(r'^cadastro/$', 'cadastro', name='produto-novo'), url(r'^(?P\d+)/$', 'detalhe', name='produto-exibe'), url(r'^(?P\d+)/comprar/$', 'comprar', name='produto-compra'), url(r'^carrinho/$', 'carrinho', name='produto-carrinho'),)Reparem que nao possuimos mais uma tupla normal, e tambem foi adicionado um atributo "name" em cada url, cujo objetivo tem justamente nomear as urls, possuimos tambem uma templatetag chamada "url", que serve para pegar dinamicamente a nossa url {%url nome-da-nossa-url%}. Com este recurso, podemos construir nosso template da seguinte forma:<a href="{%url produto-home %}">Lista</a> - <a href="{%url produto-novo %}">Novo</a> - <a href="{%url produto-carrinho%}">Carrinho de compras</a><ul>{%for p in produtos%}<li><a href="{%url produto-exibe p.id %}">{{p.nome}}</a></li>{%endfor%} </ul>Tambem podemos enviar parametros para a templatetag url, que foi o que fizemos para a listagem dos produtos. Para mais recursos sobre url nomeadas, acesse a documentacaoBonus: O Metodo get_absolute_urlNo exemplo acima, vimos como listar objetos utilizando a tempaltetag url e passando o id do objeto por parametro, no entanto, esta nao e uma das melhores praticas, o ideal seria voce acrecentar o metodo get_absolute_url dentro da classe do seu model, como visto abaixo:class Receita(models.Model): data_publicacao = models.DateTimeField(auto_now_add=True) nome = models.CharField(max_length=100) categoria = models.ForeignKey(Categoria, null=True) destaque = models.BooleanField(u"Destaque?") class Meta: ordering = ['-data_publicacao'] get_latest_by = 'data_publicacao' def __unicode__(self): return self.nome def get_absolute_url(self): return reverse('produto-exibe', args=[self.id])O metodo get_absolute_url retorna a url absoluta do objeto atraves da funcao reverse, que possui a mesma funcao da templatetag "url". Assim podemo listar os objetos de forma um pouco mais elegante:<ul>{%for p in produtos%}<li><a href="{{p.get_absolute_url}}/">{{p.nome}}</a></li>{%endfor%}</ul>Nao e regra termos o metodo get_absolute_url, voce pode criar qualquer outro metodo que faca a mesma funcao, mas o metodo get_absolute_url, e necessario para exibirmos