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

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


当前回答

运行一个开发SMTP服务器,它只输出发送给它的任何内容(如果您不想在开发服务器上实际安装SMTP)。

命令行:

python -m smtpd -n -c DebuggingServer localhost:1025

其他回答

不要编写自己的登录页面。如果你使用django.contrib.auth。

真正的,肮脏的秘密是,如果你也在使用django.contrib。Admin和django.template.loaders.app_directories。Load_template_source在你的模板加载器中,你也可以免费获得你的模板!

# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
    (r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
    (r'^accounts/logout/$','views.logout'),
)

在Django 1.2+中使用.exists(),在以前的版本中使用.count(),而不是计算整个queryset来检查是否返回任何结果。

exists()和count()都清除order by子句,并从DB中检索单个整数。然而exists()将总是返回1,而as count可能会返回更高的值,对这些值将手动应用限制。exists()中使用的has_result和count()中使用的get_count的源代码。

因为它们都返回一个整数,所以没有模型实例化,在内存中加载模型属性,也没有大的TextFields在你的DB和应用程序之间传递。

如果你已经计算了查询,.count()计算len(cached_result), .exists()计算bool(cached_result)

效率不高—例1

books = Books.objects.filter(author__last_name='Brown')
if books:
    # Do something

效率不高——例2

books = Books.objects.filter(author__last_name='Brown')
if len(books):
    # Do something

高效-例1

books = Books.objects.filter(author__last_name='Brown')
if books.count():
    # Do something

高效-例2

books = Books.objects.filter(author__last_name='Brown')
if books.exists():
    # Do something

使用异步任务。使用芹菜

我没有足够的声誉来回复这个问题,但重要的是要注意,如果你打算使用Jinja,它不支持模板块名称中的'-'字符,而Django支持。这给我带来了很多问题,并浪费了很多时间试图追踪它生成的非常模糊的错误消息。

django-admin文档:

如果你使用Bash shell,可以考虑安装Django Bash完成脚本,它存在于Django发行版中的extras/django_bash_completion中。它支持django-admin.py和manage.py命令的制表符补全,所以你可以,例如…

django-admin.py类型。 按[TAB]查看所有可用选项。 输入sql,然后输入[TAB],查看所有名称以sql开头的可用选项。