受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。
- 每个答案请仅包含一个技巧。
- 如果有要求,请注明Django版本。
受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。
不要使用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}
)
我没有足够的声誉来回复问题中的评论,但需要注意的是,如果你要使用Jinja模板引擎,它不支持在模板块名称中使用“-”字符,而Django支持。这会导致很多问题和浪费时间,因为你需要尝试追踪非常难以理解的错误信息。
在设计网站时,webdesign应用程序非常有用。 导入后,您可以添加此内容以生成示例文本:
{% load webdesign %}
{% lorem 5 p %}
django.db.models.get_model
可以让您在不导入模型的情况下检索模型。
James展示了它有多方便:“Django技巧:编写更好的模板标签-第4次迭代”。
大家都知道可以通过"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/下面得到。
当然,在生产环境中不要使用它。
我从sorl-thumbnails应用程序的文档中学到了这个技巧。您可以在模板标签中使用 "as" 关键字,以便在模板的其他位置使用调用结果。
例如:
{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>
这在Django模板标签文档中只是顺带提到,但仅涉及循环。他们没有指出您也可以在其他地方(任何地方?)使用它。
django.views.generic.list_detail.object_list -- 它为分页提供了所有逻辑和模板变量(其中之一就是我已经写了一千次的繁琐操作)。将其包装可以实现任何所需逻辑。这个宝石节省了我在“搜索结果”页面中调试错位错误的许多时间,同时还使视图代码更加整洁。
使用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,做了一些小的提交)
render
快捷方法(http://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render),来渲染页面。这将使代码更加简洁易读。 - gorsky