가장 좋아하는 Django Tips & Features?


308

'숨겨진 기능 ...'이라는 질문 시리즈에서 영감을 얻은 Django 팁이나 알려지지 않았지만 유용한 기능에 대해 궁금합니다.

  • 답변 당 하나의 팁만 포함하십시오.
  • Django 버전 요구 사항이 있으면 추가하십시오.

답변:


221

나는 단지 나 자신의 팁으로 시작할 것입니다 :)

하드 코딩 된 디렉토리 이름을 피하려면 settings.py에서 os.path.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"),
)

크레딧 :이 팁은 스크린 캐스트 ' Django From the Ground Up ' 에서 얻었 습니다 .


75
자신의 질문에 답하는 사람들을 공감해서는 안됩니다. 미리 결정된 경우에도 권장됩니다.
— Paolo Bergantino

19
이것이 왜 기본이 아닌지 이해하는 데 여전히 어려움을 겪고있는 좋은 아이디어입니다. 동일한 컴퓨터에서 몇 명의 사람들이 테스트하고 배포합니까?
— SingleNegationElimination

19
이렇게하면 항상 os.path.join ()을 입력하지 않아도 j = lambda filename: os.path.join(PROJECT_DIR, filename)됩니다. 그런 다음을 입력하면 j("static")됩니다.
— wr.

13
Windows에있는 경우 백 슬래시를 바꾸십시오. os.path.join (PROJECT_DIR, "templates"). replace ( '\\', '/')
— Peter Mortensen

7
Django 에서이 문제를 해결 하려면 code.djangoproject.com/ticket/694에 의견을 남겨 핵심 개발자에게 wontfix결정 을 재고하도록 요청하십시오 .
— sorin

128

Django Command Extensions 및 pygraphviz를 설치 한 후 다음 명령을 실행하여 정말 멋진 Django 모델 시각화를 얻으십시오.

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

니스, pygraphviz를 Windows에 올바르게 설치할 수는 없지만 graphviz를 사용하여 도트 파일에서 은밀하게 표시 할 수 있습니다.
— monkut

나는 분명히 +1로 모델 다이어그램을 공유하는 것을 좋아합니다.
— BozoJoe

이것에 대한 svg 옵션이 있습니까?
— Keyo

출력 이미지가 지금 파열 된 것 같습니다
— Brian Wigginton

119

대신 django-annoying의 render_to 데코레이터를 사용하십시오 render_to_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 (예 : 리디렉션)를 반환하면 데코레이터가 단락되고 예상대로 작동합니다.


4
@becomingGuru-자동으로 발생합니다.
— Dominic Rodger

15
HttpResponseRedirect () 및 render_to_response ()를 반환하지 않으면 괜찮습니다. 그런 다음 리디렉션이 실패합니다.
— Matthew Schinckel 5

17
나는 그것을 좋아하지 않는다. "명시적인 것이 암시적인 것보다 낫다". 데코레이터는 정확히 render_to 할 시점을 알려주지 않습니다.
— Tamás Szelei

2
@Matthew Schinckel 실제로 리디렉션을 엉망으로 만들지 않습니다-HttpResponse 객체를 반환하면 수정하지 않고 그대로 전달합니다
— Jiaaro

20
이 방법은 Django 1.3부터 ​​중복되어 있다고 생각합니다. django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
— Dolph

101

내 사이트의 템플릿 전체에 사용하는 맞춤 태그 세트가 있습니다. 자동로드하는 방법을 찾고 (DRY, 기억합니까?), 나는 다음을 발견했습니다.

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

기본적으로로드 된 모듈 (예 : 기본 urlconf)에이 모듈을 넣으면 사용자 정의 태그 모듈의 태그 및 필터를 템플릿없이 사용할 수 있습니다. {% load custom_tag_module %} .

전달 된 인수는 template.add_to_builtins()모든 모듈 경로 일 수 있습니다. 맞춤 태그 모듈은 특정 응용 프로그램에서 작동하지 않아도됩니다. 예를 들어, 프로젝트 루트 디렉토리 (예 :)의 모듈 일 수도 있습니다 'project.custom_tag_module'.


@Steef, 방금 시간 / 가슴 아픔 / 바이트를 절약했습니다. 감사합니다.
— orokusaki

정말 좋아요 감사. 또한 사용자 정의 태그 저장소는 물건을 공유하는 것이 좋습니다.
— Leandro Ardissone

다른 사람이 코드를 유지해야 할 때까지는 좋습니다. 생각하십시오 : "최소한 마법의 원리"
— Rich

96

여러 장고 프로젝트에서 작업하고 있고 같은 버전의 장고 / 응용 프로그램에 의존하지 않을 가능성이있는 경우 Virtualenv + Python = 생명의 은인.


15
이것은 롤링하는 유일한 방법입니다!
— postfuturist

3
django를 사용하여 virtualenv에 대한 튜토리얼 링크를 추가 할 수 있습니까?
— BozoJoe

2
@BozoJoe : 터미널에서 이것을하십시오 : virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; 그리고 그것은 작동합니다!
— SingleNegationElimination

87

URL을 하드 코딩하지 마십시오!

대신 URL 이름을 사용하십시오 .reverse 기능은 URL 자체를 얻을 수 있습니다.

URL 매핑을 정의 할 때 URL에 이름을 지정하십시오.

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)

URL마다 이름이 고유한지 확인하십시오.

나는 보통 스레드보기를위한 "cbx-forum-thread"와 같은 일관된 형식의 "project-appplication-view"를 가지고있다.

업데이트 (뻔뻔스럽게 아야 즈의 추가를 훔치는 ) :

이 이름은 url태그가 있는 템플릿에서 사용할 수 있습니다 .


1
나는 이것에 100 % 동의합니다. 나는 하드 코딩 된 URL을 사용하기 시작했으며 약간의 변경 사항을 수용하기 위해 URL 형식을 조금 변경했을 때 프로젝트에서 물었습니다. 나는 돌아가서 모든 것을 파고 하드 코딩 된 URL을 대체하는 데 시간이 걸렸다. 내 유일한 큰 불만은 URL 태그 오류가 전체 페이지를 죽이고 하드 코딩하면 개별 링크 만 엉망이된다는 것입니다.
— ricree

21
이것은 숨겨진 기능이 아니어야합니다. 이것은 모범 사례이며 비행하는 유일한 방법입니다.
— Skylar Saveland 2009

1
@skyl 거의 "비행하는 유일한 방법"이 아닙니다. 나는 Django dev 스프린트에 있었고 Adrian Holovaty (Django의 제작자 중 하나)는 url태그를 사용하지 않는다고 말했습니다 ... 그의 입장은 URL이 어쨌든 변경되어서는 안된다는 것입니다 ( 사용자).
— TM.


jinja2를 사용하는 경우 다음 reverse과 같이 추가 하면 다음 environment.filters['url'] = django.core.urlresolvers.reverse과 같이 템플릿에서 사용할 수 있습니다 {{ 'view-name'|url(arg1, arg2)|e }}. "HTML에 포함하려면 일부 문자를 이스케이프하려면"e "가 필요합니다)
— SingleNegationElimination


79

자신의 로그인 페이지를 쓰지 마십시오. django.contrib.auth를 사용하는 경우

정말 더러운 비밀은 django.contrib.admin을 사용하고 있고 django.template.loaders.app_directories.load_template_source가 템플릿 로더에 있으면 템플릿을 무료로 얻을 수 있다는 것입니다!

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

1
멋있는! 관리자 로그인 페이지를 재사용 할 수 있다는 것을 몰랐습니다. 감사!
— Joshua Partogi

66

컨텍스트 프로세서는 훌륭합니다.

사용자 모델이 다르고 모든 응답에 포함 시키려고한다고 가정하십시오. 이것을하는 대신 :

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

컨텍스트 프로세스를 통해 변수를 템플릿에 전달할 수 있습니다. 나는 일반적으로 내 것을 넣었다 'my_project/apps/core/context.py.

def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')

당신 settings.py의에 다음 줄을 추가하십시오TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)

이제 요청이있을 때마다 my_user키가 자동으로 포함 됩니다.

또한 신호가 이깁니다.

나는 몇 달 전에 이것에 관한 블로그 게시물을 작성 했으므로 잘라서 붙여 넣을 것입니다.

Django는 즉시 사용할 수있는 몇 가지 신호를 제공합니다. 저장, 초기화, 삭제 또는 요청이 처리되는 경우에도 사전 및 사후 작업을 수행 할 수 있습니다. 따라서 개념에서 벗어나 개념이 어떻게 사용되는지 보여 드리겠습니다. 블로그가 있다고 가정 해 봅시다.

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)

그래서 우리는 새로운 게시물을 만든 많은 블로그 핑 서비스 중 하나에 알리고 최신 게시물 캐시를 다시 작성하고 트윗합니다. 신호를 사용하면 Post 클래스에 메소드를 추가하지 않고도이 모든 작업을 수행 할 수 있습니다.

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)

거기서 함수를 정의하고 post_init 신호를 사용하여 함수를 Post 모델에 연결하고 저장 한 후 실행합니다.


4
Django의 Signals는 요즘 웹 프레임 워크를 비교할 때 반드시 필요한 기능입니다. 예를 들어 "서명"모듈의 업데이트를 수신 할 수 있지만 실제로 해당 모듈이 작동하지 않아도되며 동일한 기능을 구현하는 호환 가능한 모듈과도 작동 할 수있는 느슨하게 연결된 포럼을 작성하는 것이 좋습니다. 왜 신호가 더 잘 알려지지 않고 인기가 없는지 모르겠습니다.
— Lee B

프로젝트에서 재사용 가능한 앱을 사용하는 경우 일반적으로 타이트한 커플 링과 코드 혼란을 피하기 위해 신호가 매우 중요합니다. django 앱의 느슨한 결합에 대한 훌륭한 예를 제공했습니다. +1입니다.
— Lukasz Korzybski

신호가 비동기인지 알고 있습니까?
— Kedare

"사용자 모델이 다르고 모든 응답에 포함 시키길 원합니다." -사용자를 세션에 넣습니다 . 그러면 모든 요청에 ​​대한 데이터베이스 적중률이 줄어 듭니다.
— jammon

신호 호출은 동 기적입니다. 내 의견으로는, 일종의 비동기 작업 메커니즘이 트위터 / 페이스 북 등 (예 : rabbitmq)에 게시하는 데 더 적합하므로 외부 웹 사이트 사용자는 요청에 매달리지 않습니다.
— gorsky


46

IPython 을 사용 하여 어느 수준에서나 코드로 이동하고 IPython의 강력한 기능을 사용하여 디버깅하십시오. IPython을 설치하면 디버그하려는 위치에이 코드를 입력하십시오.

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

그런 다음 페이지를 새로 고치고 runserver 창으로 이동하면 대화식 IPython 창에있게됩니다.

TextMate에 스 니펫이 설정되어 있으므로 ipshell을 입력하고 탭을 누르십시오. 그것 없이는 살 수 없었습니다.


22
더 나은 설치 ipdb및 입력ipdb.set_trace()
— Tomasz Zieliński

또는 Eclipse / PyDev의 디버거를 사용하십시오. :-)
— jMyles

3
수입 ipdb; ipdb.set_trace () FTW!
— 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

로부터 장고 - 관리자 문서 :

Bash 쉘을 사용하는 경우 extras/django_bash_completionDjango 배포판에있는 Django bash 완료 스크립트 설치를 고려하십시오 . 그것은 탭 완성 django-admin.py및 manage.py명령을 가능하게하므로 예를 들어 ...

  • 유형 django-admin.py .
  • 사용 가능한 모든 옵션을 보려면 [TAB]을 누르십시오.
  • sql이름이로 시작하는 사용 가능한 모든 옵션을 보려면을 입력 한 다음 [TAB]을 입력하십시오 sql.

1
이것은 내가 예상했던 것보다 더 유용합니다. 감사!
— 김재영

이것은 최소한 최신 우분투에서는 기본적으로 있습니다. :-) 나는 그것이 처음부터 나올 때 놀랐다.
— odinho-Velmont

40

./manage.py runserver_plus함께 제공 facilty django_extensions 정말 굉장합니다.

그것은 무엇보다도 Werkzeug 디버거를 사용하여 스택의 각 지점에 대한 대화 형 디버깅 콘솔을 만드는 향상된 디버그 페이지를 만듭니다 (스크린 샷 참조). 또한 dump()객체 / 프레임에 대한 정보를 표시 하기 위한 매우 편리한 편의 디버깅 방법 을 제공합니다 .

여기에 이미지 설명을 입력하십시오

설치하려면 pip를 사용할 수 있습니다.

pip install django_extensions
pip install Werkzeug

그런 다음 추가 'django_extensions'사용자에 INSTALLED_APPS의 튜플 settings.py새로운 확장과 개발 서버를 시작합니다 :

./manage.py runserver_plus

디버그 방식이 변경됩니다.


37

Python 디버거 pdb를 사용하여 Django 프로젝트를 디버깅하고 싶습니다.

사용 방법을 익히는 데 유용한 링크입니다. http://www.ferg.org/papers/debugging_in_python.html


13
이것은 신의 선물입니다. 좀 더 자세한 정보를 제공하려면 코드의 아무 줄 에나 "import pdb; pdb.set_trace ()"를 추가하십시오. 페이지를 새로 고침하십시오. 중단됩니다. 이제 개발 서버를 실행중인 터미널 창으로 이동하십시오. 이제 디버그 코드를 붙여 넣은 코드의 해당 시점에있는 모든 변수에 액세스 할 수있는 대화식 쉘이되어야합니다.
— Prixc


36

Django와 함께 Jinja2를 사용하십시오 .

Django 템플릿 언어가 (나처럼!) 극도로 제한적이라는 것을 알게되면 그 언어를 고수 할 필요가 없습니다. Django는 유연하고 템플릿 언어는 나머지 시스템과 느슨하게 연결되어 있으므로 다른 템플릿 언어를 플러그인하고 http 응답을 렌더링하는 데 사용하십시오!

나는 Jinja2를 사용한다. 이는 장고 템플릿 언어의 강화 된 버전과 거의 같으며 동일한 구문을 사용하며 if 문에서 표현식을 사용할 수 있습니다! 더 이상 사용자 정의 if 태그를 만들지 않아도됩니다 if_item_in_list! 간단히 말 %{ if item in list %}하거나{% if object.field < 10 %} .

그러나 이것이 전부는 아닙니다. 템플릿 생성을 용이하게하는 더 많은 기능이 있으며 여기에 모든 기능을 사용할 수는 없습니다.


Jinja2도 사용하고 즐기지 만 "contrib"응용 프로그램에 커플 링이 있음을 발견했습니다. 특히 관리 도구는 Django 템플릿과 밀접한 관련이 있습니다. 또한 contrib.auth의 로그인 데코레이터를 Jinja2와 친숙하지만 너무 어렵지 않게 다시 만들어야했습니다.
— Joe Holloway

24
템플릿 시스템을 jinja2로 바꾸지 말고 그냥 "추가"하고 장고 템플릿을 제거하지 마십시오. 자신의보기에 Jinja2를 사용하고 관리자 인터페이스가 django 템플리트 언어를 계속 사용하게하십시오.
— hasen

4
나는 이것에 동의합니다. Django의 제한된 구문은 대부분 견딜 수 있지만 대부분 사용자 정의 태그를 작성하고 실제로 얼마나 어려운지
— 알면

당신이 원하는 경우에도, 어떤 템플릿 소스의 메타 프로그래밍을 직접 구문 분석 템플릿의 AST에 액세스 할 수 있기 때문에, Jinja2는 훨씬 더 쾌적. AST를 사용하면 기본 템플릿을 확장하는 템플릿을 찾거나 템플릿 소스 블록에 바인딩되지 않은 변수를 나열하는 것과 같은 작업이 거의 쉽지 않습니다.
— rcoder

5
고맙게도 Django 1.2에서 IF 태그가 더 똑똑해
— 졌습니다

35

assert False뷰 코드에 추가 하여 디버그 정보를 덤프하십시오.


4
False가 더 직관적이라고 생각합니다. = D
— Jiaaro

13
django dev 서버에서 프로젝트를 실행하는 경우 python의 pdb 모듈을 사용하십시오. 디버깅하는 훨씬 강력한 방법입니다. import pdb; pdb.stack_trace ()
— mazelife

pdb는 매우 유용합니다. 디버깅 속도가 빠르지 않으면 연결 시간이 초과 될 수 있습니다.
— Stephen Paulger 2009

4
나는 항상 5 / 0나 자신을 사용 합니다. 왜 다섯? 몰라.
— JasonSmith 2009

@StephenPaulger 정말? 내 브라우저 (firefox / w firebug)는 디버깅하는 동안 몇 분 동안 응답을 기다리는 것으로 보입니다.
— TM.

34

이것은 장고 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 "views"는 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
FWIW는 장고 저자는 실제로 몇 군데에서 클래스 기반 뷰를 사용하여, 예를 들어 contrib.formtools : code.djangoproject.com/browser/django/trunk/django/contrib/...
— mazelife

3
호출 메소드 를 추가하면 RestfulResource라는 클래스를 작성한 다음 urls.py가 인스턴스를 가리 키도록 할 수 있습니다.
— Stephen Paulger 2009

1
새로운 (Django 1.3?) 일반 뷰는 클래스 기반입니다.
— gorsky

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를 절약하십시오. bitbucket.org/offline/django-annoying
— pithyless

6
.. render또는 Django 1.3의 새로운 단축키 방법을 사용하십시오 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
— gorsky

20

문제의 의견에 답변 할만 큼 평판이 좋지는 않지만 Jinja 를 사용하려는 경우 Django는 템플릿 블록 이름에서 '-'문자를 지원하지 않는다는 점에 유의해야합니다 . 이로 인해 많은 문제가 발생하여 생성 된 매우 모호한 오류 메시지를 추적하는 데 시간을 낭비했습니다.


"jinja의 모호한 오류 메시지"에 적용되거나 적용되지 않을 수있는 한 가지 참고 사항. settings.py에서 TEMPLATE_DEBUG = False를 설정하십시오. 어떤 이유로 Jinja 템플릿에서 의미있는 오류가 발생합니다.
— Carl G

19

자인 응용 프로그램은 귀하의 웹 사이트를 디자인하기 시작할 때 매우 유용합니다. 가져온 후에는 이것을 추가하여 샘플 텍스트를 생성 할 수 있습니다.

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

4
참고로, 대신 장고 템플릿 Jinja2를 사용하여 누군가를 위해, 당신은 할 수 있습니다 : {{lipsum (5)}}
— 조 홀로 웨이


19

"manage.py runserver"로 실행할 수있는 개발 서버가 있다는 것을 모두 알고 있지만 정적 파일 (CSS / JS / IMG)을 제공하기위한 개발 뷰가 있다는 것을 알고 있습니까?

Django는 정적 파일을 제공 할 방법이 없으므로 새로 온 사람들은 항상 당황합니다. 이는 개발자 팀이 실제 웹 서버의 작업이라고 생각하기 때문입니다.

그러나 개발할 때 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
나는 이것을 dev 모드에서 사용하고 프로덕션에서 이것을 끄는 것을 잊지 않기 위해 해당 URL 규칙을 DEBUG 전용 조건부로 래핑합니다.
— sghael

18

나는 sorl-thumbnails 의 문서에서 이것을 배웠다. 앱 . 템플릿 태그에서 "as"키워드를 사용하면 템플릿의 다른 곳에서 호출 한 결과를 사용할 수 있습니다.

예를 들면 다음과 같습니다.

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

이것은 Django templatetag 문서를 전달할 때 언급되지만 루프 만 참조하십시오. 그들은 당신이 이것을 다른 곳에서도 사용할 수 있다고 부르지 않습니다.


7
템플릿 태그와 함께 "as"라는 키워드를 사용할 수있는 경우이 특정 태그에 의존합니다. django 자체가 아니라 의미에 따라 단일 태그로 정의됩니다. 언급 된 URL 태그에서 "as"가 어떻게 사용되는지 확인하십시오 : code.djangoproject.com/browser/django/trunk/django/template/…
— vikingosegundo

16

django.views.generic.list_detail.object_list- 페이지 매김에 대한 모든 논리 및 템플릿 변수를 제공합니다 ( 내가 작성한 천 대의 준설 중 하나). 그것을 감싸면 필요한 모든 논리를 허용합니다. 이 gem을 사용하면 "검색 결과"페이지에서 오랜 시간 동안 디버깅 오류가 발생하고 프로세스에서 뷰 코드가 더 깨끗해졌습니다.


1
djangobook.com/en/2.0/chapter11의 Generic Views 에서이 책의 새로운 장을 찾을 수 있습니다 . 주석에 하나는 책의 장고 이전 1.0 버전 (장고 책 1.0)로 이동
— 에스테반 Küber


14

xml_models 사용 를 사용하여 SQL 대신 XML REST API 백엔드를 사용하는 Django 모델을 작성 . 이는 타사 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>

그리고 지금 파이썬에서 :

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'

또한 관계 및 콜렉션을 처리 할 수 ​​있습니다. 우리는 매일 많이 사용하는 프로덕션 코드에서 매일 사용하므로 베타 버전이지만 매우 유용합니다. 또한 테스트에 사용할 수있는 훌륭한 스텁 세트가 있습니다.

(면책 조항 : 나는이 도서관의 저자는 아니지만 몇 가지 사소한 커밋을 한 커미터입니다.)


흥미로운 프로젝트, 계속 유지하십시오!
— Sergey Golovchenko

고마워, 그것은 꽤 편리합니다 :-)
— godswearhats

14

데이터베이스 마이그레이션을 사용하십시오. 남쪽을 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.