灵感来自问题系列的隐藏特征…,我很想听听你最喜欢的Django技巧或你知道的不太为人所知但有用的功能。

请在每个答案中只包含一个技巧。 添加Django版本要求(如果有的话)。


当前回答

django.views.generic.list_detail。object_list——它为分页提供了所有的逻辑和模板变量(这是我已经写了上千次的苦差事之一)。对它进行包装可以使用您需要的任何逻辑。这个gem为我节省了很多时间调试“搜索结果”页面中的一个错误,并使视图代码在这个过程中更加清晰。

其他回答

不要在本地主机上运行Django开发服务器,而是在一个合适的网络接口上运行。例如:

python manage.py runserver 192.168.1.110:8000

or

python manage.py runserver 0.0.0.0:8000

然后,您不仅可以轻松地使用Fiddler (http://www.fiddler2.com/fiddler2/)或其他工具,如HTTP调试器(http://www.httpdebugger.com/)来检查您的HTTP头,而且还可以从LAN上的其他机器访问您的开发站点进行测试。

确保你有防火墙保护,尽管开发服务器是最小的,而且相对安全。

在urlconf中使用reverse。

这是我不明白为什么它不是默认的那些技巧之一。

这里有一个链接到我拿起它的地方: http://andr.in/2009/11/21/calling-reverse-in-django/

下面是代码片段:

从django.conf.urls.defaults导入* 从django.core.urlresolvers导入反向 从django.utils.functional导入lazy django。http导入HttpResponse Reverse_lazy = lazy(reverse, str) Urlpatterns = patterns(", url(r'^comehere/', lambda request: HttpResponse('Welcome!'), name='comehere'), url (r“^ $”,“django.views.generic.simple.redirect_to”, {'url': reverse_lazy('comehere')}, name='root') )

使用IPython可以在任何级别跳转到代码中,并使用IPython的功能进行调试。一旦你安装了IPython,就把这段代码放在你想调试的地方:

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

然后,刷新页面,转到runserver窗口,您将进入一个交互式IPython窗口。

我有一个片段设置在TextMate,所以我只是键入ipshell和点击标签。没有它我活不下去。

PyCharm IDE是一个很好的编码环境,尤其是调试环境,内置了对Django的支持。

上下文处理器非常棒。

假设你有一个不同的用户模型,你想包括 在每个回应中。不要这样做:

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))

上下文过程使您能够将任何变量传递给您的 模板。我通常把我的放在'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='')

在settings.py中,将以下行添加到TEMPLATE_CONTEXT_PROCESSORS中

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

现在每次请求都会自动包含my_user键。

这也是胜利的信号。

几个月前我写了一篇关于这方面的博客文章,所以我只是要剪切和粘贴:

开箱即用的Django提供了几个信号 令人难以置信的有用。你有能力提前做好事情 发布保存,初始化,删除,甚至当请求正在进行时 处理。我们先不讲概念 演示如何使用这些。假设我们有一个博客

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)

所以你想要通知众多博客中的一个 服务我们已经做了一个新的帖子,重建最近 帖子缓存,并tweet关于它。你有信号 无需添加任何内容即可完成所有这些操作的能力 方法添加到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)

好了,通过定义这个函数并使用 post_init信号,将函数连接到Post模型 并在保存后执行它。