Python 最爱的Django小贴士;特征?

Python 最爱的Django小贴士;特征?,python,django,hidden-features,Python,Django,Hidden Features,受“隐藏的…功能”问题系列的启发,我很想听听你最喜欢的Django技巧或你知道的不太知名但有用的功能 请,每个答案只包含一个提示 添加Django版本要求(如果有) 我将从我自己的一个提示开始:) 在settings.py中使用os.path.dirname()以避免硬编码的dirname。 如果要在不同位置运行项目,请不要硬编码settings.py中的路径。如果模板和静态文件位于Django项目目录中,请在settings.py中使用以下代码: # settings.py import o

受“隐藏的…功能”问题系列的启发,我很想听听你最喜欢的Django技巧或你知道的不太知名但有用的功能

  • 请,每个答案只包含一个提示
  • 添加Django版本要求(如果有)

我将从我自己的一个提示开始:)

在settings.py中使用os.path.dirname()以避免硬编码的dirname。

如果要在不同位置运行项目,请不要硬编码settings.py中的路径。如果模板和静态文件位于Django项目目录中,请在settings.py中使用以下代码:

# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates"),
)
信用:我从屏幕广播“”中得到了这个提示。

使用
render\u to
decorator而不是
render\u to\u response

@render_to('template.html')
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return {'bars': bars}

# equals to
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return render_to_response('template.html',
                              {'bars': bars},
                              context_instance=RequestContext(request))

编辑后指出,返回HttpResponse(如重定向)将使装饰程序短路,并按预期工作。

我喜欢使用Python调试器pdb调试Django项目

这是一个有助于学习如何使用它的链接:

与Django一起使用

如果您发现Django模板语言非常受限(就像我一样!),那么您不必拘泥于此。Django非常灵活,模板语言与系统的其余部分松散耦合,因此只需插入另一个模板语言并使用它来呈现http响应

我使用,它几乎像是django模板语言的一个增强版本,它使用相同的语法,并且允许您在if语句中使用表达式!不再制作自定义的if标记,如列表中的
if\u项
!您可以简单地说
%{if item in list%}
,或者
{%if object.field<10%}


但这还不是全部;它还有很多功能可以简化模板的创建,我在这里无法一一介绍。

在视图代码中添加
断言False
以转储调试信息。

安装,然后发出以下命令以获得一个非常好看的Django模型可视化:

./manage.py graph_models -a -g -o my_project.png

不要硬编码你的网址

改为使用,并使用函数获取URL本身

定义URL映射时,请为URL命名

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)
确保每个URL的名称是唯一的

我通常有一个一致的格式“项目应用程序视图”,例如线程视图的“cbx论坛线程”

更新(无耻地偷窃):


此名称可以在模板中使用。

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

真正肮脏的秘密是,如果您同时使用django.contrib.admin和django.template.loaders.app_目录。load_template_源在模板加载器中,您也可以免费获得模板

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

--它提供了分页的所有逻辑和模板变量(其中一个我已经写了一千遍了)。允许您需要的任何逻辑。这个gem在我的“搜索结果”页面中通过一个错误为我节省了很多小时的调试时间,并且在这个过程中使查看代码更干净。

这增加了上面关于的答复

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

url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')
url(r'(?P\d+)/team/$,'project\u team',name='project\u team')
模板中可以包含以下内容:

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


当我刚开始的时候,我不知道有一个,确保你知道它的存在

当尝试在Django和另一个应用程序之间交换数据时,
request.raw\u post\u data
是一个好朋友。使用它来接收和定制流程,比如XML数据

文件:

django.db.models.get\u model
允许您在不导入模型的情况下检索模型

James展示了它的便利性:。

在开始设计网站时非常有用。导入后,您可以添加以下内容以生成示例文本:

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

我在网站的模板上使用了一组自定义标记。为了寻找一种自动加载的方法(干燥,记得吗?),我发现了以下几点:

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')
如果将其放入默认加载的模块中(例如,主urlconf),则可以在任何模板中使用自定义标记模块中的标记和过滤器,而无需使用
{%load custom_tag_module%}


传递给
模板的参数。添加到\u builtins()
可以是任何模块路径;您的自定义标记模块不必存在于特定的应用程序中。例如,它也可以是项目根目录中的一个模块(例如,
'project.custom\u tag\u module'
)。

+Python=life saver,如果您正在处理多个Django项目,并且它们可能都不依赖于同一版本的Django/应用程序。

请使用。例如,它允许查看在呈现视图时执行的所有SQL查询,并且您还可以查看其中任何一个的stacktrace。

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

来自:

如果使用BASH shell,请考虑安装Django BASH完成脚本,该脚本存在于Django分发中的ExtAs/DjangoiBasHyMealth中。它支持选项卡完成

django admin.py
manage.py
命令,因此您可以,例如

  • 键入django admin.py
  • 按[TAB]查看所有可用选项
  • 键入
    sql
    ,然后键入[TAB],查看名称以
    sql
    开头的所有可用选项
上下文处理器非常棒。
假设您有一个不同的用户模型,并且希望包括 每一个回应都是如此。而不是这样做:

def myview(request, arg, arg2=None, template='my/template.html'):
    ''' My view... '''
    response = dict()
    myuser = MyUser.objects.get(user=request.user)
    response['my_user'] = myuser
    ...
    return render_to_response(template,
                              response,
                              context_instance=RequestContext(request))
骗局
def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')
TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)
from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
    title = models.CharField(_('title'), max_length=255)
    body = models.TextField(_('body'))
    created = models.DateTimeField(auto_now_add=True)
import twitter

from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings

def posted_blog(sender, created=None, instance=None, **kwargs):
    ''' Listens for a blog post to save and alerts some services. '''
    if (created and instance is not None):
        tweet = 'New blog post! %s' instance.title
        t = twitter.PostUpdate(settings.TWITTER_USER,
                               settings.TWITTER_PASSWD,
                               tweet)
        cache.set(instance.cache_key, instance, 60*5)
       # send pingbacks
       # ...
       # whatever else
    else:
        cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)
{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>
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
from django.conf.urls.defaults import *
from views import MyRestView

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)
<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a> 
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}
    )
from IPython.Shell import IPShellEmbed; IPShellEmbed()()
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/path/to/media'}),
python -m smtpd -n -c DebuggingServer localhost:1025
<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>
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'
pip install django_extensions
pip install Werkzeug
./manage.py runserver_plus