답변:
나는 단지 나 자신의 팁으로 시작할 것입니다 :)
하드 코딩 된 디렉토리 이름을 피하려면 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 ' 에서 얻었 습니다 .
j = lambda filename: os.path.join(PROJECT_DIR, filename)
됩니다. 그런 다음을 입력하면 j("static")
됩니다.
Django Command Extensions 및 pygraphviz를 설치 한 후 다음 명령을 실행하여 정말 멋진 Django 모델 시각화를 얻으십시오.
./manage.py graph_models -a -g -o my_project.png
대신 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 (예 : 리디렉션)를 반환하면 데코레이터가 단락되고 예상대로 작동합니다.
내 사이트의 템플릿 전체에 사용하는 맞춤 태그 세트가 있습니다. 자동로드하는 방법을 찾고 (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'
.
여러 장고 프로젝트에서 작업하고 있고 같은 버전의 장고 / 응용 프로그램에 의존하지 않을 가능성이있는 경우 Virtualenv + Python = 생명의 은인.
virtualenv myNewEnv --no-site-packages
; . myNewEnv/bin/activate
; pip install django
; 그리고 그것은 작동합니다!
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
태그가 있는 템플릿에서 사용할 수 있습니다 .
url
태그를 사용하지 않는다고 말했습니다 ... 그의 입장은 URL이 어쨌든 변경되어서는 안된다는 것입니다 ( 사용자).
{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/
reverse
과 같이 추가 하면 다음 environment.filters['url'] = django.core.urlresolvers.reverse
과 같이 템플릿에서 사용할 수 있습니다 {{ 'view-name'|url(arg1, arg2)|e }}
. "HTML에 포함하려면 일부 문자를 이스케이프하려면"e "가 필요합니다)
django 디버그 도구 모음을 사용하십시오 . 예를 들어, 뷰를 렌더링하는 동안 수행 된 모든 SQL 쿼리를 볼 수 있으며 쿼리에 대한 스택 추적도 볼 수 있습니다.
자신의 로그인 페이지를 쓰지 마십시오. 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'),
)
사용자 모델이 다르고 모든 응답에 포함 시키려고한다고 가정하십시오. 이것을하는 대신 :
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 모델에 연결하고 저장 한 후 실행합니다.
IPython 을 사용 하여 어느 수준에서나 코드로 이동하고 IPython의 강력한 기능을 사용하여 디버깅하십시오. IPython을 설치하면 디버그하려는 위치에이 코드를 입력하십시오.
from IPython.Shell import IPShellEmbed; IPShellEmbed()()
그런 다음 페이지를 새로 고치고 runserver 창으로 이동하면 대화식 IPython 창에있게됩니다.
TextMate에 스 니펫이 설정되어 있으므로 ipshell을 입력하고 탭을 누르십시오. 그것 없이는 살 수 없었습니다.
ipdb
및 입력ipdb.set_trace()
개발자 서버에 실제로 SMTP를 설치하지 않으려는 경우 전송되는 모든 것을 출력하는 개발 SMTP 서버를 실행하십시오.
명령 줄 :
python -m smtpd -n -c DebuggingServer localhost:1025
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
.. 전자 메일을 manage.py
출력으로 인쇄합니다 .
로부터 장고 - 관리자 문서 :
Bash 쉘을 사용하는 경우 extras/django_bash_completion
Django 배포판에있는 Django bash 완료 스크립트 설치를 고려하십시오 . 그것은 탭 완성 django-admin.py
및 manage.py
명령을 가능하게하므로 예를 들어 ...
django-admin.py
.sql
이름이로 시작하는 사용 가능한 모든 옵션을 보려면을 입력 한 다음 [TAB]을 입력하십시오 sql
../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
디버그 방식이 변경됩니다.
Python 디버거 pdb를 사용하여 Django 프로젝트를 디버깅하고 싶습니다.
사용 방법을 익히는 데 유용한 링크입니다. http://www.ferg.org/papers/debugging_in_python.html
Django와 다른 응용 프로그램간에 데이터를 교환하려고 할 때 request.raw_post_data
좋은 친구입니다. 이를 사용하여 XML 데이터와 같은 사용자 정의 프로세스를 수신하고 처리하십시오.
설명서 : http://docs.djangoproject.com/en/dev/ref/request-response/
Django와 함께 Jinja2를 사용하십시오 .
Django 템플릿 언어가 (나처럼!) 극도로 제한적이라는 것을 알게되면 그 언어를 고수 할 필요가 없습니다. Django는 유연하고 템플릿 언어는 나머지 시스템과 느슨하게 연결되어 있으므로 다른 템플릿 언어를 플러그인하고 http 응답을 렌더링하는 데 사용하십시오!
나는 Jinja2를 사용한다. 이는 장고 템플릿 언어의 강화 된 버전과 거의 같으며 동일한 구문을 사용하며 if 문에서 표현식을 사용할 수 있습니다! 더 이상 사용자 정의 if 태그를 만들지 않아도됩니다 if_item_in_list
! 간단히 말 %{ if item in list %}
하거나{% if object.field < 10 %}
.
그러나 이것이 전부는 아닙니다. 템플릿 생성을 용이하게하는 더 많은 기능이 있으며 여기에 모든 기능을 사용할 수는 없습니다.
assert False
뷰 코드에 추가 하여 디버그 정보를 덤프하십시오.
5 / 0
나 자신을 사용 합니다. 왜 다섯? 몰라.
이것은 장고 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>
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),
)
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}
)
render
또는 Django 1.3의 새로운 단축키 방법을 사용하십시오 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
자인 응용 프로그램은 귀하의 웹 사이트를 디자인하기 시작할 때 매우 유용합니다. 가져온 후에는 이것을 추가하여 샘플 텍스트를 생성 할 수 있습니다.
{% load webdesign %}
{% lorem 5 p %}
django.db.models.get_model
모델을 가져 오지 않고 검색 할 수 있습니다.
James는 "장고 팁 : 더 나은 템플릿 태그 작성 — 반복 4"라는 것이 얼마나 편리한 지 보여줍니다 .
"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/에서 사용할 수 있습니다.
물론 프로덕션 환경에서는 사용하지 마십시오.
나는 sorl-thumbnails 의 문서에서 이것을 배웠다. 앱 . 템플릿 태그에서 "as"키워드를 사용하면 템플릿의 다른 곳에서 호출 한 결과를 사용할 수 있습니다.
예를 들면 다음과 같습니다.
{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>
이것은 Django templatetag 문서를 전달할 때 언급되지만 루프 만 참조하십시오. 그들은 당신이 이것을 다른 곳에서도 사용할 수 있다고 부르지 않습니다.
django.views.generic.list_detail.object_list- 페이지 매김에 대한 모든 논리 및 템플릿 변수를 제공합니다 ( 내가 작성한 천 대의 준설 중 하나). 그것을 감싸면 필요한 모든 논리를 허용합니다. 이 gem을 사용하면 "검색 결과"페이지에서 오랜 시간 동안 디버깅 오류가 발생하고 프로세스에서 뷰 코드가 더 깨끗해졌습니다.
PyCharm IDE 는 Django를 기본적으로 지원하여 코딩 및 디버깅하기에 좋은 환경입니다.
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'
또한 관계 및 콜렉션을 처리 할 수 있습니다. 우리는 매일 많이 사용하는 프로덕션 코드에서 매일 사용하므로 베타 버전이지만 매우 유용합니다. 또한 테스트에 사용할 수있는 훌륭한 스텁 세트가 있습니다.
(면책 조항 : 나는이 도서관의 저자는 아니지만 몇 가지 사소한 커밋을 한 커미터입니다.)