programing

마음에 드는 장고의 힌트와 기능

nicescript 2022. 10. 30. 16:07
반응형

마음에 드는 장고의 힌트와 기능

'의 숨겨진 특징'이라는 질문 시리즈에 영감을 받아 여러분이 가장 좋아하는 장고 팁이나 덜 알려져 있지만 유용한 특징에 대해 듣고 싶습니다.

  • 답변당 팁 하나만 포함시켜 주세요.
  • Django 버전 요건이 있는 경우 추가합니다.

제 자신의 힌트로 시작하겠습니다. :)

하드 코드화된 dirname을 피하려면 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 Command Extensions 및 pygraphviz를 설치한 후 다음 명령을 실행하여 Django 모델 시각화를 정말 멋지게 만듭니다.

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

chango-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, remember?)을 찾다가 다음을 발견했습니다.

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

)에 할 수 .이러한 태그는 "urlconf"(urlconf)를 사용하지 .{% load custom_tag_module %}.

은 론은 to to to to로 .template.add_to_builtins()에는 임의의 모듈 경로를 지정할 수 있습니다.커스텀 태그 모듈은 특정 응용 프로그램에 존재할 필요가 없습니다.「 」 「 」 、 「 」 ( 「 」 ) 」'project.custom_tag_module'를 참조해 주세요.

Virtualenv + Python = 여러 개의 Django 프로젝트를 수행하고 있으며 모두 동일한 버전의 Django/애플리케이션에 의존하지 않을 가능성이 있는 경우 Life saver.

URL을 하드코드하지 마세요!

대신 URL 이름과 함수를 사용하여 URL 자체를 가져옵니다.

URL 매핑을 정의할 때 URL에 이름을 지정합니다.

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

이름이 URL마다 고유한지 확인합니다.

스레드 뷰의 경우 보통 일관된 형식인 "project-application-view"를 사용합니다(예: "cbx-forum-thread").

업데이트(부끄러움 없이 아야즈의 추가를 훔침):

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

django 디버깅툴바를 사용합니다.예를 들어 보기를 렌더링하는 동안 수행된 모든 SQL 쿼리를 볼 수 있으며 이러한 쿼리의 스택 추적을 볼 수도 있습니다.

로그인 페이지를 직접 작성하지 마십시오.django.contrib을 사용한다면.인증합니다.

진짜 더러운 비밀은 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자동으로 키를 누릅니다.

또한 승리 신호를 보냅니다.

몇 달 전에 블로그에 글을 올렸기 때문에 잘라내서 붙여 넣겠습니다.

개봉 후 장고는 여러분에게 믿을 수 없을 정도로 유용한 몇 가지 신호를 제공합니다.저장, 초기화, 삭제 또는 요청이 처리 중인 경우에도 저장 전 및 게시 작업을 수행할 수 있습니다.이제 개념에서 벗어나 어떻게 사용되는지 보여 드리겠습니다.블로그가 있다고 칩시다.

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)

새로운 투고를 작성한 다수의 블로그 ping 서비스 중 하나에 통지하고 최신 투고 캐시를 재구축하여 트윗을 하고 싶은 경우입니다.신호를 사용하면 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()()

그런 다음 페이지를 새로 고치고 실행 서버 창으로 이동하면 대화형 IPython 창이 나타납니다.

TextMate에 스니펫이 설정되어 있기 때문에 ipshell을 입력하고 탭을 누릅니다.그것 없이는 살 수 없어요.

(개발 서버에 SMTP 를 실제로 인스톨 하고 싶지 않은 경우) 송신되는 모든 것을 출력하는 개발 SMTP 서버를 실행합니다.

명령줄:

python -m smtpd -n -c DebuggingServer localhost:1025

django-admin 매뉴얼에서 다음 절차를 수행합니다.

쉘을 Bash에 스크립트를 하는 것을 이는 Bash에 있습니다.extras/django_bash_completion고고유유유유유유하게 합니다.django-admin.py ★★★★★★★★★★★★★★★★★」manage.py명령어를 사용할 수 있습니다.

  • 「」라고 입력합니다.django-admin.py.
  • 사용 가능한 모든 옵션을 보려면 [TAB](탭)을 누릅니다.
  • 「」라고 입력합니다.sql하면 이름이 [TAB]로 사용 됩니다.sql.

./manage.py runserver_plusdjango_extensions가 포함된 facilty는 정말 멋집니다.

확장 디버깅 페이지를 만듭니다.이 페이지는 특히 Werkzeug 디버거를 사용하여 스택의 각 포인트에 대한 대화형 디버깅 콘솔을 만듭니다(스크린샷 참조). 방식도 합니다.dump()오브젝트 또는 프레임에 대한 정보를 표시합니다.

여기에 이미지 설명 입력

설치하려면 pip을 사용합니다.

pip install django_extensions
pip install Werkzeug

에 '''를 추가합니다.'django_extensions'your INSTALLED_APPSsettings.py새로운 확장자로 개발 서버를 기동합니다.

./manage.py runserver_plus

그러면 디버깅 방법이 변경됩니다.

Python 디버거 pdb를 사용하여 Django 프로젝트를 디버깅하는 것을 좋아합니다.

이 링크는 사용법을 배우는데 도움이 됩니다.http://www.ferg.org/papers/debugging_in_python.html

프로그램 하려고 할 때, 른른른른른른른 when when when when when when when when when when when when when 。request.raw_post_data좋은 친구입니다.예를 들어 XML 데이터를 수신하고 사용자 지정 처리하는 데 사용합니다.

문서: http://docs.djangoproject.com/en/dev/ref/request-response/

장고와 함께 진자2를 사용하세요.

만약 당신이 (나처럼) Django 템플릿 언어가 매우 제한적이라고 생각한다면, 당신은 그것에 얽매이지 않아도 됩니다.Django는 유연하고 템플릿 언어는 시스템의 나머지 부분에 느슨하게 결합되어 있으므로 다른 템플릿 언어를 연결하고 http 응답을 렌더링하는 데 사용하십시오.

저는 Jinja2를 사용하고 있습니다.이는 거의 django 템플릿 언어의 파워업 버전과 비슷하며 동일한 구문을 사용하며 if 문에 식을 사용할 수 있습니다!와 같은 커스텀 if-tag를 만들 필요가 없습니다.if_item_in_list 라고 됩니다.%{ if item in list %} , 「」{% if object.field < 10 %}.

이뿐만이 아닙니다.템플릿을 쉽게 만들 수 있는 기능이 많이 있습니다.다만, 여기 있는 모든 기능은 사용할 수 없습니다.

assert False디버깅 정보를 덤프합니다.

이것에 의해, Django 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 "뷰"는 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 문서에 표시되는 내용) 범용 뷰를 사용합니다.그것은 같은 일을 한다render_to_response단, 템플릿콘텍스트에 RequestContext가 자동으로 추가되어 컨텍스트프로세서를 암묵적으로 사용할 수 있게 됩니다.으로 할 수 .render_to_response지만만 왜???LOC를 사용하다템플릿에 Request Context를 포함하면 컨텍스트프로세서를 사용하는 것 외에 다음과 같은 작업을 수행할 수 있습니다.

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

해당 코멘트에 회신할 만한 평판은 없지만, Jinja를 사용할 경우 템플릿 블록 이름에 '-'자를 지원하지 않는 반면, Jango는 지원하지 않습니다.이로 인해 많은 문제가 발생했고 그로 인해 발생한 매우 불명확한 오류 메시지를 추적하느라 시간을 낭비했습니다.

웹 디자인 앱은 웹 사이트 디자인을 시작할 때 매우 유용합니다.가져온 후에는 다음을 추가하여 샘플 텍스트를 생성할 수 있습니다.

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

django.db.models.get_model를 사용하면 모델을 가져오지 않고 가져올 수 있습니다.

James는 이것이 얼마나 편리한지 보여줍니다: "장고: 템플릿 태그 쓰기 향상 - 반복 4 ".

「manage.py runserver」로 실행할 수 있는 개발 서버가 있는 것은 누구나 알고 있습니다만, 정적 파일(CSS/JS/IMG)을 제공하기 위한 개발 뷰도 있는 것을 알고 계십니까?

새로 온 사람들은 항상 당황한다. 왜냐하면 장고는 정적 파일을 처리하는 방법이 없기 때문이다.개발팀은 이것이 실제 웹 서버를 위한 일이라고 생각하기 때문입니다.

그러나 개발 시에는 Apache + mod_wisgi를 설정하고 싶지 않을 수 있습니다.그것은 무겁습니다.그런 다음 URL에 다음 항목을 추가할 수 있습니다.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 템플리트태그 매뉴얼에 기재되어 있지만 루프에 대해서만 언급하고 있습니다.다른 곳(어디서나)에서도 사용할 수 있다고는 말하지 않습니다.

django.views.generic.list_detail.object_list - 페이지 번호부여에 관한 모든 논리 및 템플릿 변수(현재 1,000번 이상 작성한 변수 중 하나)를 제공합니다.포장하면 필요한 논리를 모두 사용할 수 있습니다.이 보석을 사용하면 "검색 결과" 페이지에서 오류를 하나씩 디버깅하는 데 걸리는 시간을 많이 절약할 수 있고 프로세스에서 보기 코드를 보다 깔끔하게 만들 수 있습니다.

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>

이제 python:

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'

또한 관계와 수집도 처리할 수 있습니다.많이 사용되는 프로덕션 코드로 매일 사용하기 때문에 베타 버전이지만 매우 편리합니다.또한 테스트에서 사용할 수 있는 스터브 세트도 갖추어져 있습니다.

(면책자: 저는 이 라이브러리의 작성자는 아니지만, 몇 가지 사소한 커밋을 한 커밋자입니다.)

데이터베이스 마이그레이션을 사용합니다.South를 사용합니다.

언급URL : https://stackoverflow.com/questions/550632/favorite-django-tips-features

반응형