URL, Template, Model에 대한 django의 고급 응용 프로그램

10221 단어 django
URL 구성에 대한 몇 가지 팁:
1. 보기 접두사를 추가하는 방법:
from django.conf.urls.defaults import *
 
urlpatterns = patterns('mysite.views',
    (r'^hello/$', 'hello'),
    (r'^time/$', 'current_datetime'),
    (r'^time/plus/(d{1,2})/$', 'hours_ahead'),
)

2. 이름 지정 매개변수를 사용합니다.
from django.conf.urls.defaults import *
from mysite import views
 
urlpatterns = patterns('',
    (r'^articles/(?P<year>\d{4})/$', views.year_archive),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)

보기는 다음과 같습니다.
month_archive(request, year='2006', month='03')
이름 지정 매개변수를 사용하는 순서는 다음과 같습니다.
  • 명명된 매개변수가 있는 경우 명명되지 않은 모든 매개변수를 무시합니다
  • .
  • 없으면 순서 매개 변수로 호출
  • 상기 두 가지 방식 중 추가 옵션을 전달할 수 있다.

  • 3. 일반 보기 생성
    # urls.py
     
    from django.conf.urls.defaults import *
    from mysite import views
     
    urlpatterns = patterns('',
        (r'^events/$', views.event_list),
        (r'^blog/entries/$', views.entry_list),
    )
     
    # views.py
     
    from django.shortcuts import render_to_response
    from mysite.models import Event, BlogEntry
     
    def event_list(request):
        obj_list = Event.objects.all()
        return render_to_response('mysite/event_list.html', {'event_list': obj_list})
     
    def entry_list(request):
        obj_list = BlogEntry.objects.all()
        return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})

    현재 재구성은 다음과 같습니다.
    # urls.py
     
    from django.conf.urls.defaults import *
    from mysite import models, views
     
    urlpatterns = patterns('',
        (r'^events/$', views.object_list, {'model': models.Event}),
        (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
    )
     
    # views.py
     
    from django.shortcuts import render_to_response
     
    def object_list(request, model):
        obj_list = model.objects.all()
        template_name = 'mysite/%s_list.html' % model.__name__.lower()
        return render_to_response(template_name, {'object_list': obj_list})

    4. 일치 특례
    정규 표현식을 통해 대량의 url 요청을 처리할 때 특정한 url 요청에 대해 다른 보기 처리 함수를 호출해야 할 수도 있습니다.해결 방법은 일치하는 URL 특례를 일반적인 정규 표현식 앞에 두는 것이다. 예를 들어 다음과 같다.
    urlpatterns = patterns('',
        # ...
        ('^auth/user/add/$', views.user_add_stage),
        ('^([^/]+)/([^/]+)/add/$', views.add_stage),
        # ...
    )

    5. 다른 URL 포함
    from django.conf.urls.defaults import *
     
    urlpatterns = patterns('',
        (r'^weblog/', include('mysite.blog.urls')),
        (r'^photos/', include('mysite.photos.urls')),
        (r'^about/$', 'mysite.views.about'),
    )

    참고: 포함된 URL은 $로 끝나지 않습니다!!!
    6. 추가 매개 변수 전달
    from django.conf.urls.defaults import *
     
    urlpatterns = patterns('',
        (r'^blog/', include('inner'), {'blogid': 3}),
    )
     
    # inner.py
     
    from django.conf.urls.defaults import *
     
    urlpatterns = patterns('',
        (r'^archive/$', 'mysite.views.archive'),
        (r'^about/$', 'mysite.views.about'),
        (r'^rss/$', 'mysite.views.rss'),
    )

    템플릿에 대한 고급 팁:
    RequestContext 클래스 및 Context 프로세서
    다음은 RequestContext의 사용을 예로 들어 보겠습니다.
    from django.template import loader, Context
     
    def view_1(request):
        # ...
        t = loader.get_template('template1.html')
        c = Context({
            'app': 'My app',
            'user': request.user,
            'ip_address': request.META['REMOTE_ADDR'],
            'message': 'I am view 1.'
        })
        return t.render(c)
     
    def view_2(request):
        # ...
        t = loader.get_template('template2.html')
        c = Context({
            'app': 'My app',
            'user': request.user,
            'ip_address': request.META['REMOTE_ADDR'],
            'message': 'I am the second view.'
        })
        return t.render(c)

    RequestContext를 사용하면 위의 코드를 단순화할 수 있습니다.
    from django.template import loader, RequestContext
     
    def custom_proc(request):
        "A context processor that provides 'app', 'user' and 'ip_address'."
        return {
            'app': 'My app',
            'user': request.user,
            'ip_address': request.META['REMOTE_ADDR']
        }
     
    def view_1(request):
        # ...
        t = loader.get_template('template1.html')
        c = RequestContext(request, {'message': 'I am view 1.'},
                processors=[custom_proc])
        return t.render(c)
     
    def view_2(request):
        # ...
        t = loader.get_template('template2.html')
        c = RequestContext(request, {'message': 'I am the second view.'},
                processors=[custom_proc])
        return t.render(c)

    renderto_response() 함수, 우리는context 를 사용할 수 있습니다instance 매개 변수:
    from django.shortcuts import render_to_response
    from django.template import RequestContext
     
    def custom_proc(request):
        "A context processor that provides 'app', 'user' and 'ip_address'."
        return {
            'app': 'My app',
            'user': request.user,
            'ip_address': request.META['REMOTE_ADDR']
        }
     
    def view_1(request):
        # ...
        return render_to_response('template1.html',
            {'message': 'I am view 1.'},
            context_instance=RequestContext(request, processors=[custom_proc]))
     
    def view_2(request):
        # ...
        return render_to_response('template2.html',
            {'message': 'I am the second view.'},
            context_instance=RequestContext(request, processors=[custom_proc]))

    템플릿 필터 사용자정의
    필터 함수에는 하나 또는 두 개의 매개 변수가 있는데, 첫 번째 매개 변수는 입력이고, 두 번째 매개 변수는 옵션이다.다음은 몇 가지 예를 살펴보겠습니다.
    def cut(value, arg):
        "Removes all values of arg from the given string"     return value.replace(arg, '')
    {{ somevariable|cut:" " }}
    def lower(value): # Only one argument.     "Converts a string into all lowercase"     return value.lower()

    사용자 정의 필터를 등록하는 코드는 다음과 같습니다.
    from django import template
     
    register = template.Library() register.filter('cut', cut) register.filter('lower', lower)

    템플릿 레이블 사용자 정의
    django에서 템플릿 시스템의 작업은 두 부분으로 나뉘는데 그것이 바로 컴파일링과 렌더링이다.
    컴파일하는 과정에서django는 템플릿 라벨을 분석하고 해당하는django를 생성합니다.template.render() 함수가 포함된 Node 객체다음 예제를 참조하십시오.
    Hello, {{ person.name }}.
     
    {% ifequal name.birthday today %}
        Happy birthday!
    {% else %}
        Be sure to come back on your birthday
        for a splendid surprise message.
    {% endifequal %}

    위의 템플릿은 분석 후에 다음과 같은 Node 목록을 생성합니다.
  • Text node: "Hello, "
  • Variable node: person.name
  • Text node: "."
  • IfEqual node: name.birthday and today

  • 컴파일링이 완료되면 렌더링에 각 Node의 render() 함수를 차례로 호출합니다.
    컴파일 함수의 작성
    다음은 {% current time%} 태그를 사용하여 사용자 정의 태그를 만드는 방법을 보여 줍니다.우리가 실현하고자 하는 라벨의 사용 방법은 다음과 같다.
    <p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p>

    우선 컴파일 함수:
    from django import template
     
    register = template.Library()  def do_current_time(parser, token):
        try:
            # split_contents() knows not to split quoted strings.         tag_name, format_string = token.split_contents()     except ValueError:
            msg = '%r tag requires a single argument' % token.split_contents()[0]         raise template.TemplateSyntaxError(msg)     return CurrentTimeNode(format_string[1:-1])

    주의해야 할 것은 컴파일 함수에서 이상을 던져서는 안 된다는 것이다.되돌아오는 것은 틀림없이 노드의 하위 클래스일 것이다.
    Node 하위 클래스 만들기
    다음은 CurrentTimeNode 클래스를 만드는 방법입니다.
    import datetime
     
    class CurrentTimeNode(template.Node):
        def __init__(self, format_string):
            self.format_string = str(format_string)
     
        def render(self, context):
            now = datetime.datetime.now()
            return now.strftime(self.format_string)

    등록 레이블
    태그를 등록하는 방법은 다음과 같습니다.
    register.tag('current_time', do_current_time)
    모델의 고급 응용
    추가 관리자 추가
    # models.py
     
    from django.db import models
     
    # ... Author and Publisher models here ...
     
    class BookManager(models.Manager):
        def title_count(self, keyword):
            return self.filter(title__icontains=keyword).count()
     
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
        num_pages = models.IntegerField(blank=True, null=True)
        objects = BookManager()
     
        def __unicode__(self):
            return self.title

    다음을 사용합니다.
    >>> Book.objects.title_count('django')
    4
    >>> Book.objects.title_count('python')
    18

    좋은 웹페이지 즐겨찾기