最喜欢的Django技巧和功能?

308

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

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

21

不要使用render_to_response将上下文与模板绑定并呈现它(这是Django文档通常展示的)。相反,使用通用视图direct_to_template。它执行与render_to_response相同的操作,但还自动向模板上下文中添加RequestContext,隐式地允许使用上下文处理器。您可以手动使用render_to_response来执行此操作,但为什么要费心呢?这只是要记住的另一个步骤和另一个LOC。除了使用上下文处理器外,将RequestContext放入模板中还允许您做一些事情,例如:

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

这非常有用。事实上,对于普通视图来说+1。Django文档大多将它们显示为简单应用程序中甚至没有views.py文件的快捷方式,但您也可以在自己的视图函数中使用它们:

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

通过在django-annoying中使用@render_to装饰器,可以进一步节省LOC。http://bitbucket.org/offline/django-annoying/ - pithyless
6
你可以使用 Django 1.3 的新 render 快捷方法(http://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render),来渲染页面。这将使代码更加简洁易读。 - gorsky

20

我没有足够的声誉来回复问题中的评论,但需要注意的是,如果你要使用Jinja模板引擎,它不支持在模板块名称中使用“-”字符,而Django支持。这会导致很多问题和浪费时间,因为你需要尝试追踪非常难以理解的错误信息。


一个可能适用于“Jinja模板中的晦涩错误消息”的提示是确保在settings.py中将TEMPLATE_DEBUG = False。由于某种原因,这将为您提供有意义的Jinja模板错误。 - Carl G

19

在设计网站时,webdesign应用程序非常有用。 导入后,您可以添加此内容以生成示例文本:

{% load webdesign %}
{% lorem 5 p %}

4
对于使用 Jinja2 而非 Django 模板的任何人,可使用以下语法:{{ lipsum(5) }}。该语法用于生成指定数量(此处为 5)的假文。 - Joe Holloway

19

不错啊!我一直在处理循环依赖时使用懒加载。 - Filip Dupanović

19

大家都知道可以通过"manage.py runserver"命令运行开发服务器,但是你是否知道还有一种开发视图可以用来提供静态文件(CSS/JS/IMG)的服务呢?

新手常常困惑于Django没有提供任何方法来提供静态文件。这是因为开发团队认为这是真正的Web服务器的工作。

但是在开发时,你可能不想设置Apache + mod_wisgi,那么你只需将以下内容添加到urls.py中即可:

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

你的CSS/JS/IMG将会在www.yoursite.com/site_media/下面得到。

当然,在生产环境中不要使用它。


6
我在开发模式下使用这个功能,为了确保在生产环境中不会忘记关闭它,我将该URL规则用DEBUG条件进行了包装。 - sghael

18

我从sorl-thumbnails应用程序的文档中学到了这个技巧。您可以在模板标签中使用 "as" 关键字,以便在模板的其他位置使用调用结果。

例如:

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

这在Django模板标签文档中只是顺带提到,但仅涉及循环。他们没有指出您也可以在其他地方(任何地方?)使用它。


7
关键词"as"是否能与模板标签一起使用取决于特定的标签。这不是由Django本身定义的,而是由单个标签根据它们的含义来确定。请查看提到的url标签以了解如何使用"as": http://code.djangoproject.com/browser/django/trunk/django/template/defaulttags.py - vikingosegundo

16

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


(翻译:PyCharm IDE是一个不错的编程和特别是调试环境,具有内置的Django支持。)

16

django.views.generic.list_detail.object_list -- 它为分页提供了所有逻辑和模板变量(其中之一就是我已经写了一千次的繁琐操作)。将其包装可以实现任何所需逻辑。这个宝石节省了我在“搜索结果”页面中调试错位错误的许多时间,同时还使视图代码更加整洁。


1
您可以在http://www.djangobook.com/en/2.0/chapter11/上找到有关通用视图的书籍新版本章节。关于评论的那个链接是指向Django book 1.0的预1.0版本的章节。 - Esteban Küber

14

使用数据库迁移。使用South


14

使用xml_models创建Django模型,使用XML REST API后端(而不是SQL后端)。这在建模第三方API时非常有用-您可以获得与您习惯的所有QuerySet句法相同的功能。您可以从PyPI安装它。

来自API的XML:

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

现在用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 'joe@example.com'

它还可以处理关系和集合。我们在经常使用的生产代码中每天都使用它,所以即使它是beta版,也非常可用。它还有一组很好的存根,您可以在测试中使用。

(免责声明:虽然我不是这个库的作者,但我现在是一个committer,做了一些小的提交)


有趣的项目,继续加油! - Sergey Golovchenko
谢谢,这很方便 :-) - godswearhats

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