受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。
- 每个答案请仅包含一个技巧。
- 如果有要求,请注明Django版本。
受到“Hidden features of…”问题系列的启发,我很想听听您所知道的Django技巧或较少人知但实用的功能。
使用 djangorecipe 来管理您的项目
您只需要执行以下操作即可开始:
Create a buildout.cfg with following content in it:
[buildout]
parts=django
[django]
recipe=djangorecipe
version=1.1.1
project=my_new_site
settings=development
python bootstrap.py
(or python bootstrap_dev.py
if you want to use distribute)../bin/buildout
就这样。现在你应该有一个名为“my_new_site”的新文件夹,它是你的新Django 1.1.1项目,在./bin中,你会找到django
脚本,它替换了普通安装中的manage.py。
好处是什么?假设你想在项目中使用像django-comment-spamfighter这样的东西。你只需要更改你的buildout.cfg文件,像这样:
[buildout]
parts=django
[django]
recipe=djangorecipe
version=1.1.1
project=my_new_site
settings=development
eggs=
django-comments-spamfighter==0.4
./bin/buildout
时,buildout将下载该软件包并修改./bin/django以将其添加到PYTHONPATH中。wsgi=true
设置,就会在您的./bin文件夹中出现一个"django.wsgi"文件 :-)test
选项设置为应用程序列表,则djangorecipe将为您创建一个漂亮的包装器,用于运行项目中列出的所有应用程序的测试。在您的urlconf中使用reverse。
这是其中一种技巧,我不明白为什么它不是默认设置。
这里是我学到这个技巧的链接: http://andr.in/2009/11/21/calling-reverse-in-django/
以下是代码片段:
from django.conf.urls.defaults import *
from django.core.urlresolvers import reverse
from django.utils.functional import lazy
from django.http import 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')
)
import socket
if socket.gethostname() == 'productionserver.com':
DEBUG = False
else:
DEBUG = True
根据服务器主机名自动设置Django应用程序的调试。
from django.db.models.loading import get_models
for m in get_models():
globals()[m.__name__] = m
#NOTE: if you have two models with the same name you'll only end up with one of them
然后,在您的 ~/.ipython/ipythonrc 文件中,在 "Python files to load and execute" 部分中放入以下代码:
execfile /path/to/project/ipythonrc.py
./manage.py shell
时,您都可以已经导入并准备好使用所有模型。再也不需要导入其他模型了。您还可以将您经常执行的任何其他代码放入ipythonrc.py文件中,以节省时间。在初始化时更改Django表单字段属性
有时向Form类传递额外的参数是很有用处的。
from django import forms
from mymodels import Group
class MyForm(forms.Form):
group=forms.ModelChoiceField(queryset=None)
email=forms.EmailField()
some_choices=forms.ChoiceField()
def __init__(self,my_var,*args,**kwrds):
super(MyForm,self).__init__(*args,**kwrds)
self.fields['group'].queryset=Group.objects.filter(...)
self.fields['email'].widget.attrs['size']='50'
self.fields['some_choices']=[[x,x] for x in list_of_stuff]
source: Dzone snippets
django_extensions
来自https://github.com/django-extensions/django-extensions,非常实用。
以下是一些很棒的./manage.py
命令:
shell_plus
- 自动导入所有已安装应用程序的模型show_urls
- 显示项目中所有应用程序定义的URLrunscript
- 在项目上下文中运行任何脚本(您可以使用模型和其他与Django相关的模块)来晚了一点,但是Django Canvas最近推出了,它应该在这里占据一席之地。
不要使用django-admin.py startproject
开始你的项目。相反,你可以使用类似Django Canvas的工具来帮助你组合一个空白项目和你需要的模块。
你只需前往该网站,勾选一些选项,然后下载一个空白项目,非常简单。
它拥有所有常见的东西,如South模式迁移和命令扩展,以及本文提到的许多其他最佳实践。此外,它还有一个很棒的start.sh/shart.bat
脚本,可以安装Python、Virtualenv、Pip、Django以及你需要从Windows、OSX或Linux的新副本开始的任何内容。
PythonOption django.root
是正确的方法。请参阅相关文档:http://docs.djangoproject.com/en/1.2/howto/deployment/modpython/#basic-configuration - Agos