最喜欢的Django技巧和功能?

308

受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。

  • 每个答案请仅包含一个技巧。
  • 如果有要求,请注明Django版本。
55个回答

46

使用IPython,可以在任何级别上跳转到您的代码,并使用IPython的强大功能进行调试。安装IPython后,只需在想要调试的位置加入以下代码:

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

然后,刷新页面,进入您的运行服务器窗口,您将进入一个交互式IPython窗口。

我在TextMate中设置了一段代码片段,所以我只需键入ipshell并按Tab键即可。我离不开它。


22
最好安装ipdb,然后只需输入ipdb.set_trace() - Tomasz Zieliński
或者使用 Eclipse/PyDev 的调试器。 :-) - jMyles
3
导入ipdb模块,并设置断点,太棒了! - Hassek

43

运行一个开发用的SMTP服务器,它将只输出发送到它的所有内容(如果您不想在开发服务器上真正安装SMTP)。

命令行:

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

12
在Django 1.2中,您可以使用控制台和文件电子邮件后端来实现相同的目的。 - Dmitry Shevchenko
非常出色!非常适合注册!+1 - BozoJoe
3
Django 1.2中的替代方法是通过设置EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend',这样会将电子邮件打印到manage.py输出中。 - vdboor

41

django-admin文档中得知:

如果您使用Bash shell,请考虑安装Django bash自动补全脚本,该脚本位于Django发行版的extras/django_bash_completion目录下。它启用了django-admin.pymanage.py命令的制表符自动完成功能,这样您就可以:

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

1
这比我预期的更有用。谢谢! - Jeeyoung Kim
这在新版本的Ubuntu上是默认设置。:-) 当它第一次从无处出现时,我感到惊讶。 - odinho - Velmont

40

django_extensions附带的./manage.py runserver_plus功能非常棒。

它创建了一个增强版的调试页面,其中包含使用Werkzeug调试器为堆栈中的每个点创建交互式调试控制台(请参见截图)。此外,它还提供了一个非常有用的便捷调试方法dump(),可显示有关对象/帧的信息。

enter image description here

要安装,请使用pip:

pip install django_extensions
pip install Werkzeug

然后在settings.pyINSTALLED_APPS元组中添加'django_extensions',并使用新扩展启动开发服务器:

./manage.py runserver_plus

这将改变您调试的方式。


37

37

13
这真是太好了。如果需要更多信息,只需在代码的任何一行上添加“import pdb; pdb.set_trace()”,然后刷新您的页面。它会挂起。现在转到运行开发服务器的终端窗口。它应该是一个交互式shell,您可以访问所有变量,因为它们正处于您粘贴调试代码的那个点。 - priestc

36

与Django一起使用Jinja2

如果你觉得Django模板语言太过受限(就像我一样!),那么你不必被它困住。Django很灵活,这个模板语言与系统的其他部分之间松散耦合,所以只要插入另一个模板语言并用它来渲染你的HTTP响应即可!

我使用Jinja2,它几乎是Django模板语言的增强版,使用相同的语法,并允许在if语句中使用表达式!不再需要制作自定义if标签,例如if_item_in_list!你可以简单地说%{ if item in list %}或者{% if object.field < 10 %}

但这还不是全部;它有许多其他特性来简化模板创建,这里无法详细介绍所有功能。


我也喜欢使用Jinja2,但是我发现它与“contrib”应用程序有一些耦合。特别是,管理工具与Django模板紧密相关。此外,我不得不重新创建contrib.auth中的登录装饰器以适应Jinja2,但并不太难。 - Joe Holloway
24
不要用jinja2替换模板系统,只需“添加”它,不要删除Django的模板。在自己的视图中使用Jinja2,并让管理界面继续使用Django模板语言。 - hasen
4
我完全同意这个观点。Django的语法限制大多数时候还能接受,但是当你需要创建自定义标签时,你会发现实际上有多么的困难,而Jinja2则是一股清新的空气。 - SingleNegationElimination
另外,如果你想在模板源代码上进行任何元编程操作,Jinja2 更加愉悦,因为你可以直接访问解析模板的 AST。通过遍历 AST,如查找哪些模板扩展了基本模板或列出模板源代码块中未绑定的变量等任务几乎变得非常容易。 - rcoder
5
感谢Django 1.2版本中IF标签变得更加智能。 - Nixarn
请确保在settings.py中将TEMPLATE_DEBUG = False。由于某些原因,TEMPLATE_DEBUG == True会给您带来难以理解的错误消息。 - Carl G

35

在您的视图代码中添加assert False以转储调试信息。


4
我认为assert False更加直观 =D。 - Jiaaro
13
如果你在Django开发服务器中运行项目,可以使用Python的pdb模块进行调试。这是一种更为强大的调试方式:import pdb; pdb.stack_trace() - mazelife
4
我总是使用5 / 0。为什么是五?不知道。 - JasonSmith
我一直使用 raise ValueError("Debug") 来进行调试。 - Ted
我更喜欢更令人满意的:diaf。 - Sverre Rabbelier
显示剩余2条评论

34

这篇回答是关于Django URL命名和反向URL分发的补充。

URL命名也可以在模板中有效地使用。例如,对于给定的URL模式:

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

您可以在模板中包含以下内容:

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

27

Django的“视图”只需要是可调用的函数,返回一个HttpResponse就可以了,因此你可以轻松地创建类视图,就像Ruby on Rails和其他框架一样。

有几种创建类视图的方法,以下是我最喜欢的:

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

你可以在基本视图中添加各种其他内容,例如条件请求处理和授权。

一旦你设置好了你的视图,你的urls.py文件将看起来像这样:

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

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)

2
值得一提的是,Django 的作者们实际上在一些地方使用了基于类的视图,例如 contrib.formtools:http://code.djangoproject.com/browser/django/trunk/django/contrib/formtools/wizard.py - mazelife
3
如果您添加一个__call__方法,您就可以创建一个名为RestfulResource的类,然后让您的urls.py指向这些实例。 - Stephen Paulger
1
新的(Django 1.3?)通用视图是基于类的。 - gorsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接