Dicas e recursos favoritos do Django?

308

Inspirado na série de perguntas 'Recursos ocultos de ...', estou curioso para saber sobre suas dicas favoritas do Django ou sobre recursos menos conhecidos, porém úteis, que você conhece.

  • Por favor, inclua apenas uma dica por resposta.
  • Adicione os requisitos da versão do Django, se houver algum.
Haes
fonte

Respostas:

221

Vou começar com uma dica minha :)

Use os.path.dirname () em settings.py para evitar nomes de diretórios codificados.

Não codifique os caminhos em seu settings.py se você deseja executar seu projeto em locais diferentes. Use o seguinte código em settings.py se seus modelos e arquivos estáticos estiverem localizados no diretório do projeto Django:

# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates"),
)

Créditos: recebi essa dica do screencast ' Django From the Ground Up '.

Haes
fonte
75
Você não deve desconsiderar as pessoas que respondem suas próprias perguntas. É incentivado, mesmo que seja pré-determinado.
21411 Paolo Bergantino
19
Essa é uma ideia tão boa que ainda tenho dificuldade em entender por que não é o padrão. Quantas pessoas testam e implantam na mesma máquina?
SingleNegationElimination
19
Isso você alivia de sempre digitar os.path.join () que fica chato muito rápido: j = lambda filename: os.path.join(PROJECT_DIR, filename). Então você só precisa digitar j("static").
wr.
13
Se você estiver no Windows, em seguida, substituir as barras invertidas: os.path.join (project_dir, "modelos") substituir ( '\\', '/').
Peter Mortensen
7
Se você realmente deseja consertar isso no Django, deixe um comentário em code.djangoproject.com/ticket/694 pedindo aos desenvolvedores principais que reconsiderem a wontfixdecisão.
sorin
128

Instale as extensões de comando do Django e pygraphviz e, em seguida, emita o seguinte comando para obter uma visualização de modelo do Django realmente bonita:

./manage.py graph_models -a -g -o my_project.png
Haes
fonte
Bom, não foi possível obter o pygraphviz para instalar corretamente no Windows, mas ainda pode ser oculto a partir do arquivo de ponto usando o graphviz.
monkut
Eu amo compartilhar diagramas de modelos com este definitivamente um +1
BozoJoe 19/10/10
Existe uma opção svg para isso?
Keyo 22/11/2010
imagem de saída parece estar preso agora
Brian Wigginton
119

Use o render_to decorador de django-annoying em vez de render_to_response.

@render_to('template.html')
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return {'bars': bars}

# equals to
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return render_to_response('template.html',
                              {'bars': bars},
                              context_instance=RequestContext(request))

Editado para indicar que o retorno de um HttpResponse (como um redirecionamento) irá causar um curto-circuito no decorador e funcionar da maneira que você espera.

user20955
fonte
4
@becomingGuru - isso acontece automaticamente.
Dominic Rodger
15
Tudo bem, a menos que você esteja retornando alguns HttpResponseRedirect () se alguns render_to_response () s. Os redirecionamentos falham.
Matthew Schinckel 17/07/2009
17
Eu não gosto disso "Explícito é melhor que implícito". O decorador não está dizendo quando exatamente vai renderizar.
Tamás Szelei
2
@Matthew Schinckel ele realmente não atrapalhar redirecionamentos - se você retornar um HttpResponse objeto que ele apenas passa adiante sem modificá-lo
Jiaaro
20
Eu acredito que essa abordagem agora é redundante a partir do Django 1.3, consulte django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
Dolph
101

Há um conjunto de tags personalizadas que uso em todos os modelos do meu site. Procurando uma maneira de carregá-lo automaticamente (SECO, lembra?), Encontrei o seguinte:

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

Se você colocar isso em um módulo carregado por padrão (seu principal urlconf, por exemplo), você terá as tags e filtros do seu módulo de tag personalizado disponíveis em qualquer modelo, sem usar {% load custom_tag_module %}.

O argumento passado para template.add_to_builtins()pode ser qualquer caminho do módulo; seu módulo de tag personalizado não precisa estar em um aplicativo específico. Por exemplo, também pode ser um módulo no diretório raiz do seu projeto (por exemplo, 'project.custom_tag_module').

Steef
fonte
@ Steef, você acabou de me salvar muito tempo / mágoa / bytes, obrigado.
orokusaki
Muito legal. Obrigado. Também seria ótimo compartilhar um repositório de tags personalizadas, não acha?
Leandro Ardissone
Isso é ótimo até que alguém precise manter seu código. Pense: "princípio da menos mágica"
Rich
96

Virtualenv + Python = salva-vidas se você estiver trabalhando em vários projetos do Django e existe a possibilidade de que todos eles não dependam da mesma versão do Django / um aplicativo.

phillc
fonte
15
Esta é a única maneira de rolar!
postfuturist
3
Você poderia adicionar alguns links de tutorial para virtualenv com django?
BozoJoe
2
@BozoJoe: Fazei isto em seu terminal: virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; E isso simplesmente funciona!
SingleNegationElimination
87

Não codifique seus URLs!

Use nomes de URL e a reversefunção para obter o próprio URL.

Ao definir seus mapeamentos de URL, atribua nomes aos seus URLs.

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)

Verifique se o nome é exclusivo por URL.

Normalmente, tenho um formato consistente "project-appplication-view", por exemplo, "cbx-forum-thread" para uma visualização de threads.

UPDATE (roubando descaradamente a adição de ayaz ):

Este nome pode ser usado em modelos com a urltag .

hasen
fonte
1
Eu concordo 100% com este. Comecei a usar URLs codificados e ele me mordeu em um projeto quando alterei um pouco o formato da URL para acomodar algumas alterações. Aproveitei o tempo para voltar e vasculhar tudo e substituir os URLs codificados. Minha única reclamação é que os erros das tags de URL matam a página inteira, enquanto o código rígido apenas atrapalha o link individual.
Ricree
21
Esse não deve ser um recurso oculto, é uma prática recomendada e a única maneira de voar.
Skylar Saveland
1
@ skyl É dificilmente "a única maneira de voar". Eu estava em um sprint de desenvolvimento do Django e Adrian Holovaty (um dos criadores do Django) disse que ele nem usa a urltag ... Sua posição é que os URLs não deveriam mudar de qualquer maneira (se você quiser ser amigável com o seu Comercial).
TM.
você também pode usar isso em modelos, como em {% url path.to.view.name arg1 arg2 %} docs.djangoproject.com/en/dev/ref/templates/builtins/…
SingleNegationElimination
Se você usa o jinja2, basta adicionar reverseassim environment.filters['url'] = django.core.urlresolvers.reversee você pode usá-lo em seus modelos da seguinte forma: {{ 'view-name'|url(arg1, arg2)|e }}(o "e" é necessário para escapar de alguns caracteres para inclusão no HTML)
SingleNegationElimination
81

Use a barra de ferramentas de depuração do django . Por exemplo, ele permite visualizar todas as consultas SQL realizadas durante a renderização da visualização e você também pode visualizar o rastreamento de pilha para qualquer uma delas.

Eugene Morozov
fonte
79

Não escreva suas próprias páginas de login. Se você estiver usando o django.contrib.auth.

O segredo real e sujo é que, se você também estiver usando o django.contrib.admin, e o django.template.loaders.app_directories.load_template_source estiver em seus carregadores de modelo, você também poderá obtê-lo gratuitamente!

# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
    (r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
    (r'^accounts/logout/$','views.logout'),
)
SingleNegationElimination
fonte
1
Legal! Eu não sabia que podemos reutilizar a página de login dos administradores. Obrigado!
21009 Joshua Partogi
66

Os processadores de contexto são impressionantes.

Digamos que você tenha um modelo de usuário diferente e deseje incluí-lo em todas as respostas. Em vez de fazer isso:

def myview(request, arg, arg2=None, template='my/template.html'):
    ''' My view... '''
    response = dict()
    myuser = MyUser.objects.get(user=request.user)
    response['my_user'] = myuser
    ...
    return render_to_response(template,
                              response,
                              context_instance=RequestContext(request))

Os processos de contexto permitem passar qualquer variável para seus modelos. Eu normalmente coloco o meu em 'my_project/apps/core/context.py:

def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')

No seu, settings.pyadicione a seguinte linha ao seuTEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)

Agora, toda vez que uma solicitação é feita, ela inclui a my_userchave automaticamente.

Também sinais de vitória.

Escrevi um post sobre isso há alguns meses, então vou apenas recortar e colar:

O Django fornece diversos sinais que são incrivelmente úteis. Você tem a capacidade de fazer as coisas antes e depois de salvar, iniciar, excluir ou mesmo quando uma solicitação está sendo processada. Então, vamos nos afastar dos conceitos e demonstrar como eles são usados. Digamos que temos um blog

from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
    title = models.CharField(_('title'), max_length=255)
    body = models.TextField(_('body'))
    created = models.DateTimeField(auto_now_add=True)

Então, de alguma forma, você deseja notificar um dos muitos serviços de ping de blogs que criamos uma nova postagem, reconstruir o cache de postagens mais recentes e twittar sobre ela. Bem, com sinais, você tem a capacidade de fazer tudo isso sem precisar adicionar nenhum método à classe Post.

import twitter

from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings

def posted_blog(sender, created=None, instance=None, **kwargs):
    ''' Listens for a blog post to save and alerts some services. '''
    if (created and instance is not None):
        tweet = 'New blog post! %s' instance.title
        t = twitter.PostUpdate(settings.TWITTER_USER,
                               settings.TWITTER_PASSWD,
                               tweet)
        cache.set(instance.cache_key, instance, 60*5)
       # send pingbacks
       # ...
       # whatever else
    else:
        cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)

Lá vamos nós, definindo essa função e usando o sinal post_init para conectar a função ao modelo Post e executá-la depois que ela foi salva.

notzach
fonte
4
Os Sinais do Django são um recurso obrigatório para mim hoje em dia, quando comparamos frameworks da web. É ótimo escrever um fórum pouco acoplado, digamos, que possa escutar, digamos, atualizações de um módulo "assinatura", mas não exigir que ele funcione, e que também possa funcionar com módulos compatíveis que implementam o mesmo recurso. Não sei por que os sinais não são mais conhecidos e populares.
21799 Lee B
Os sinais são muito importantes para evitar o acoplamento apertado e a bagunça de código em geral, se usarmos alguns aplicativos reutilizáveis ​​em nosso projeto. Você forneceu um excelente exemplo para o acoplamento flexível de aplicativos django, +1 para isso.
Lukasz Korzybski
Você sabe se os sinais são assíncronos?
Kedare
"Digamos que você tenha um modelo de usuário diferente e queira incluí-lo em todas as respostas." - Coloque o usuário na sessão . Isso economiza uma ocorrência no banco de dados para cada solicitação.
jammon
As chamadas dos sinais são síncronas. Na minha opinião, algum tipo de mecanismo de trabalho assíncrono é mais adequado para, digamos, publicar no Twitter / Facebook / etc (ie - rabbitmq), para que os usuários de fora do site não sejam solicitados.
Gorsky
58

Quando eu estava começando, eu não sabia que havia um Paginator , certifique-se de saber da sua existência!

hasen
fonte
2
: D mesmo para mim! Passei dias paginando!
Vikingosegundo
46

Use o IPython para acessar seu código em qualquer nível e depurar usando o poder do IPython. Depois de instalar o IPython, basta colocar esse código onde quiser depurar:

from IPython.Shell import IPShellEmbed; IPShellEmbed()()

Atualize a página, vá para a janela do servidor de execução e você estará em uma janela IPython interativa.

Eu tenho um trecho configurado no TextMate, então digito ipshell e clico em tab. Eu não poderia viver sem isso.

sheats
fonte
22
Melhor instalar ipdbe, em seguida, basta digitaripdb.set_trace()
Tomasz Zieliński
Ou use o depurador do Eclipse / PyDev. :-)
jMyles 21/02
3
importar ipdb; ipdb.set_trace () FTW!
Hassek
43

Execute um servidor SMTP de desenvolvimento que apenas produza o que for enviado a ele (se você não deseja realmente instalar o SMTP no seu servidor de desenvolvimento).

linha de comando:

python -m smtpd -n -c DebuggingServer localhost:1025
Carl G
fonte
12
você pode usar o console e-mail arquivo backends no Django 1.2 com o mesmo propósito
Dmitry Shevchenko
excepcional! perfeito para registro! 1
BozoJoe 19/10/10
3
Alternativa no Django 1.2 com configurações: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' ..que imprimirá o email na manage.pysaída.
vdboor
41

Na documentação do django-admin :

Se você usa o shell Bash, considere instalar o script de conclusão do basquete do Django, que reside na extras/django_bash_completiondistribuição do Django. Permite o preenchimento de guias django-admin.pye manage.pycomandos, para que você possa, por exemplo ...

  • Digite django-admin.py.
  • Pressione [TAB] para ver todas as opções disponíveis.
  • Digite sql, depois [TAB], para ver todas as opções disponíveis cujos nomes começam sql.
John
fonte
1
Isso é mais útil do que eu esperava. Obrigado!
Jeeyoung Kim
Isso está por padrão no Ubuntu mais recente, pelo menos. :-) Fiquei espantado quando surgiu do nada.
odinho - Velmont 26/04
40

A ./manage.py runserver_plusfacilidade que vem com django_extensions é realmente incrível.

Ele cria uma página de depuração aprimorada que, entre outras coisas, usa o depurador Werkzeug para criar consoles de depuração interativos para cada ponto da pilha (veja a captura de tela). Ele também fornece um método de depuração de conveniência muito útil dump()para exibir informações sobre um objeto / quadro.

insira a descrição da imagem aqui

Para instalar, você pode usar o pip:

pip install django_extensions
pip install Werkzeug

Em seguida, adicione 'django_extensions'à sua INSTALLED_APPStupla settings.pye inicie o servidor de desenvolvimento com a nova extensão:

./manage.py runserver_plus

Isso mudará a maneira como você depura.

DavidWinterbottom
fonte
37

Eu gosto de usar o depurador Python pdb para depurar projetos do Django.

Este é um link útil para aprender como usá-lo: http://www.ferg.org/papers/debugging_in_python.html

Harold
fonte
13
Isso é uma dádiva de Deus. Para fornecer um pouco mais de informação, basta adicionar este: "import pdb; pdb.set_trace ()" em qualquer linha do seu código. Atualize sua página. Vai travar. Agora vá para a janela do terminal em que você está executando o servidor de desenvolvimento. Agora deve ser um shell interativo onde você pode acessar todas as variáveis ​​como elas estão naquele ponto do seu código em que você colou o código de depuração.
priestc 01/09/09
37

Ao tentar trocar dados entre o Django e outro aplicativo, request.raw_post_dataé um bom amigo. Use-o para receber e processar, digamos, dados XML.

Documentação: http://docs.djangoproject.com/en/dev/ref/request-response/

chefsmart
fonte
5
É assim que se faz. Obrigado, +1
SingleNegationElimination
36

Use Jinja2 ao lado do Django.

Se você acha a linguagem de modelo do Django extremamente restritiva (como eu!), Não precisa ficar presa a ela. O Django é flexível, e a linguagem do modelo é fracamente acoplada ao resto do sistema, então apenas conecte outra linguagem do modelo e use-a para renderizar suas respostas http!

Eu uso o Jinja2 , é quase como uma versão aprimorada da linguagem de modelo do django, usa a mesma sintaxe e permite que você use expressões nas instruções if! Não é mais necessário criar tags if personalizadas, como if_item_in_list! você pode simplesmente dizer %{ if item in list %}, ou {% if object.field < 10 %}.

Mas isso não é tudo; ele tem muitos outros recursos para facilitar a criação de modelos, que eu não posso usar em todos eles aqui.

hasen
fonte
Também uso e aprecio o Jinja2, mas descobri que existem alguns acoplamentos para os aplicativos "contrib". Particularmente, a ferramenta de administração está bastante ligada aos modelos do Django. Além disso, eu tive que recriar os decoradores de login no contrib.auth para ser amigável com o Jinja2, mas não muito difícil.
911 Joe Holloway
24
Não substitua o sistema de modelos pelo jinja2, apenas "adicione", não remova os templtes do django. Use o Jinja2 para suas próprias visualizações e deixe a interface do administrador continuar usando a linguagem de modelo do django.
hasen
4
Eu concordo com isso com ferocidade. Sintaxe limitada do Django é tolerável, a maior parte do tempo, mas quando você chegar ao ponto de fazer marcas personalizadas e descobrir o quão duro que realmente é, Jinja2 é uma lufada de ar fresco
SingleNegationElimination
Além disso, se você quiser fazer uma metaprogramação na fonte do modelo, o Jinja2 é muito mais agradável, pois você pode acessar diretamente o AST dos modelos analisados. Caminhar no AST torna tarefas como descobrir quais modelos estendem um modelo base ou listar as variáveis ​​não acopladas em um bloco de origem do modelo, quase que trivialmente fácil.
Rcoder 13/10/09
5
Felizmente no Django 1.2 a marca IF é um monte de forma mais inteligente
Nixarn
35

Adicione assert Falseseu código de exibição para despejar informações de depuração.

zgoda
fonte
4
Eu acho que assert False é mais intuitivo = D
Jiaaro
13
se você estiver executando seu projeto no servidor de desenvolvimento django, use o módulo pdb do python. É uma maneira muito mais poderosa de depurar: import pdb; pdb.stack_trace ()
mazelife 14/11/2009
O pdb é muito útil, é provável que o tempo limite de suas conexões seja excedido, a menos que você seja muito rápido na depuração.
Stephen Paulger
4
Eu sempre 5 / 0me uso . Por que cinco? Nenhuma idéia.
21909 JasonSmith
@StephenPaulger realmente? Meu navegador (firefox / w firebug) parece contente em aguardar alguns minutos por uma resposta enquanto eu depuro.
TM.
34

Isso adiciona à resposta acima sobre nomes de URL do Django e envio reverso de URL .

Os nomes de URL também podem ser efetivamente usados ​​nos modelos. Por exemplo, para um determinado padrão de URL:

url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')

você pode ter o seguinte em modelos:

<a href="{% url project_team project.id %}">Team</a>
ayaz
fonte
27

Como as "visualizações" do Django só precisam ser chamadas que retornam um HttpResponse, você pode criar facilmente visualizações baseadas em classe como as do Ruby on Rails e outras estruturas.

Existem várias maneiras de criar visualizações baseadas em classe, eis a minha favorita:

from django import http

class RestView(object):
    methods = ('GET', 'HEAD')

    @classmethod
    def dispatch(cls, request, *args, **kwargs):
        resource = cls()
        if request.method.lower() not in (method.lower() for method in resource.methods):
            return http.HttpResponseNotAllowed(resource.methods)
        try:
            method = getattr(resource, request.method.lower())
        except AttributeError:
            raise Exception("View method `%s` does not exist." % request.method.lower())
        if not callable(method):
            raise Exception("View method `%s` is not callable." % request.method.lower())
        return method(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return http.HttpResponse()

    def head(self, request, *args, **kwargs):
        response = self.get(request, *args, **kwargs)
        response.content = ''
        return response

Você pode adicionar todos os tipos de outras coisas, como manipulação e autorização condicional de solicitações, na sua visão básica.

Depois de configurar suas visualizações, seu urls.py ficará mais ou menos assim:

from django.conf.urls.defaults import *
from views import MyRestView

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)
mmalone
fonte
2
FWIW, os autores Django realmente usar visualizações baseadas em classe em alguns lugares, por exemplo contrib.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/...
mazelife
3
Se você adicionar um método de chamada , poderá criar uma classe chamada RestfulResource e fazer com que seu urls.py aponte para instâncias.
Stephen Paulger
1
As novas visualizações genéricas (Django 1.3?) São baseadas em classes.
Gorsky
21

Em vez de usar render_to_responsepara vincular seu contexto a um modelo e renderizá-lo (que é o que os documentos do Django geralmente mostram), use a visão genérica direct_to_template. Ele faz o mesmo que render_to_responsefaz, mas também adiciona automaticamente RequestContext ao contexto do modelo, permitindo implicitamente que processadores de contexto sejam usados. Você pode fazer isso manualmente usando render_to_response, mas por que se preocupar? É apenas mais um passo para lembrar e outro LOC. Além de usar processadores de contexto, ter RequestContext em seu modelo permite fazer coisas como:

<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a> 

o que é muito útil. De fato, marque +1 nas visualizações genéricas em geral. Os documentos do Django geralmente os mostram como atalhos por não terem um arquivo views.py para aplicativos simples, mas você também pode usá-los dentro de suas próprias funções de exibição:

from django.views.generic import simple

def article_detail(request, slug=None):
    article = get_object_or_404(Article, slug=slug)
    return simple.direct_to_template(request, 
        template="articles/article_detail.html",
        extra_context={'article': article}
    )
mazelife
fonte
Economize ainda mais LOC usando o decorador @render_to disponível em django-irritante. bitbucket.org/offline/django-annoying
pithyless
6
..ou usar novo rendermétodo de atalho de Django 1,3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
Gorsky
20

Eu não tenho reputação suficiente para responder ao comentário em questão, mas é importante observar que, se você usar o Jinja , NÃO suporta o caractere '-' nos nomes dos blocos de modelo, enquanto o Django o faz. Isso me causou muitos problemas e perdi tempo tentando rastrear a mensagem de erro muito obscura gerada.

user61000
fonte
Uma observação que pode ou não ser aplicável a "mensagens de erro obscuras do jinja". Certifique-se de definir TEMPLATE_DEBUG = False em settings.py. Por alguma razão, isso fornecerá erros significativos nos modelos Jinja.
Carl Carl G
19

O aplicativo de web design é muito útil quando você começa a criar seu site. Depois de importado, você pode adicionar isso para gerar texto de exemplo:

{% load webdesign %}
{% lorem 5 p %}
Ross Light
fonte
4
FYI, para qualquer um usando Jinja2 vez de templates do Django, você pode fazer: {{lipsum (5)}}
Joe Holloway
19

Todo mundo sabe que existe um servidor de desenvolvimento que você pode executar com "manage.py runserver", mas você sabia que existe uma visão de desenvolvimento para servir arquivos estáticos (CSS / JS / IMG) também?

Os recém-chegados sempre ficam intrigados porque o Django não oferece nenhuma maneira de servir arquivos estáticos. Isso ocorre porque a equipe de desenvolvedores acha que é o trabalho para um servidor Web da vida real.

Mas, ao desenvolver, talvez você não queira configurar o Apache + mod_wisgi, é pesado. Em seguida, você pode adicionar o seguinte a urls.py:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/path/to/media'}),

Seu CSS / JS / IMG estará disponível em www.yoursite.com/site_media/.

Obviamente, não o use em um ambiente de produção.

e-satis
fonte
6
Eu uso isso no modo dev, e apenas para garantir que não esqueça de desativar isso na produção, envolvo essa regra de URL em uma condição DEBUG apenas.
Novelas
18

Eu aprendi este na documentação para as miniaturas sorl aplicativo . Você pode usar a palavra-chave "as" nas tags de modelo para usar os resultados da chamada em outro lugar do seu modelo.

Por exemplo:

{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>

Isso é mencionado de passagem na documentação do Django templatetag, mas apenas em referência a loops. Eles não dizem que você pode usar isso em outro lugar (em qualquer lugar?).

Joe Kueser
fonte
7
Se uma palavra-chave como "como" puder ser usada com uma tag de modelo depende dessa tag em particular. Não é definido pelo próprio django, mas por tags únicas, dependendo do seu significado. Dê uma olhada na url-tag mencionada para ver como "as" é usado: code.djangoproject.com/browser/django/trunk/django/template/…
vikingosegundo
16

django.views.generic.list_detail.object_list - Ele fornece todas as variáveis ​​lógicas e de gabarito para paginação (uma daquelas tarefas que escrevi que mil vezes agora). A quebra permite qualquer lógica necessária. Essa gema me salvou muitas horas de erros de depuração de um por um nas minhas páginas "Resultados da pesquisa" e torna o código de exibição mais limpo no processo.

jds
fonte
1
Você pode encontrar a nova versão do capítulo do livro sobre Visualizações genéricas em djangobook.com/en/2.0/chapter11 . A única sobre o comentário vai para a pré-versão 1.0 Django do livro (Django livro 1.0)
Esteban Kuber
16

O PyCharm IDE é um ambiente agradável para codificar e, especialmente, depurar, com suporte embutido para o Django.

Arte
fonte
14

Use xml_models para criar modelos do Django que usam um back-end da API XML REST (em vez de um SQL). Isso é muito útil, especialmente ao modelar APIs de terceiros - você obtém a mesma sintaxe QuerySet com a qual está acostumado. Você pode instalá-lo a partir do PyPI.

XML de uma API:

<profile id=4>
    <email>joe@example.com</email>
    <first_name>Joe</first_name>
    <last_name>Example</last_name>
    <date_of_birth>1975-05-15</date_of_birth>
</profile>

E agora em python:

class Profile(xml_models.Model):
    user_id = xml_models.IntField(xpath='/profile/@id')
    email = xml_models.CharField(xpath='/profile/email')
    first = xml_models.CharField(xpath='/profile/first_name')
    last = xml_models.CharField(xpath='/profile/last_name')
    birthday = xml_models.DateField(xpath='/profile/date_of_birth')

    finders = {
        (user_id,):  settings.API_URL +'/api/v1/profile/userid/%s',
        (email,):  settings.API_URL +'/api/v1/profile/email/%s',
    }

profile = Profile.objects.get(user_id=4)
print profile.email
# would print '[email protected]'

Ele também pode lidar com relacionamentos e coleções. Usamos todos os dias em códigos de produção muito usados, portanto, mesmo sendo beta, é muito útil. Ele também possui um bom conjunto de stubs que você pode usar em seus testes.

(Isenção de responsabilidade: embora eu não seja o autor desta biblioteca, agora sou um committer, tendo feito alguns commits menores)

godswearhats
fonte
projeto interessante, continue assim!
Sergey Golovchenko
Obrigado, é muito útil :-)
godswearhats
14

Use migrações de banco de dados. Use o sul .

vad
fonte