URL, Template, Model에 대한 django의 고급 응용 프로그램
10221 단어 django
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 목록을 생성합니다.
컴파일링이 완료되면 렌더링에 각 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.