가장 좋아하는 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 Extensionspygraphviz를 설치 한 후 다음 명령을 실행하여 정말 멋진 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.pymanage.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.