13: 클래스 기반 일반 보기

20105 단어
클래스 기반 일반 보기
앞에서 우리가 말했듯이django의 유니버설 보기, 몰라도django의 유니버설 보기는 내 앞에 있는 수필을 보러 가세요. 감사합니다.
django의 유니버설 보기는 많은 코드를 생략해 주지만 가끔은django의 유니버설 보기가 우리의 모든 수요를 만족시키지 못할 때가 있다. 예를 들어 속성과 방법을 다시 정의할 때나 우리가 쓰기 방법을 바꾸고 싶을 때이다. 따라서django는 클래스 기반의 유니버설 보기를 제공한다. 하위 클래스나 URL에 참고하는 방법을 통해 클래스 기반의 유니버설 보기를 설정한다.
유니버설 보기와 클래스 기반의 유니버설 보기는 두 가지 다른 쓰기 방법이다. 앞에서 소개한 유니버설 보기는 모든 코드가 url 프로필에 집중되고 클래스 기반의 유니버설 보기는'부류 계승 및 덮어쓰기 방법과 속성'을 설정하는 데 집중된다. 다음은 함수 기반의 보기와 클래스 기반의 보기의 대응 관계이다.
함수 기반
클래스 기반
django.views.generic.simple.direct_to_template
django.views.generic.base.TemplateView
django.views.generic.simple.redirect_to
django.views.generic.base.RedirectView
django.views.generic.list_detail.object_list
django.views.generic.list.ListView
django.views.generic.list_detail.object_detail
django.views.generic.detail.DetailView
django.views.generic.create_update.create_object
django.views.generic.edit.CreateView
django.views.generic.create_update.update_object
django.views.generic.edit.UpdateView
django.views.generic.create_update.delete_object
django.views.generic.edit.DeleteView
django.views.generic.date_based.archive_index
django.views.generic.dates.ArchiveIndexView
django.views.generic.date_based.archive_year
django.views.generic.dates.YearArchiveView
django.views.generic.date_based.archive_month
django.views.generic.dates.MonthArchiveView
django.views.generic.date_based.archive_week
django.views.generic.dates.WeekArchiveView
django.views.generic.date_based.archive_day
django.views.generic.dates.DayArchiveView
django.views.generic.date_based.archive_today
django.views.generic.dates.TodayArchiveView
django.views.generic.date_based.object_detail
django.views.generic.dates.DateDetailView
단순 용법
템플릿 about만 보여주고 싶은지 생각해 봐.html,django는 일반적인 보기를 제공하여 이 일을 할 수 있습니다. 우리는 그것을 계승한 다음에 템플릿 이름을 덮어쓰면 됩니다. 사실TemplateView 클래스에 대응하는 것은direct 입니다.to_template
# some_app/views.py

from django.views.generic import TemplateView

class AboutView(TemplateView):

    template_name = "about.html"

그리고 url 프로필에서 상응하는 방법을 직접 호출하면 됩니다.
# urls.py

from django.conf.urls import patterns, url, include

from some_app.views import AboutView

urlpatterns = patterns('',

    (r'^about/', AboutView.as_view()),

)

또는 우리는 URL에서 직접 전참하는 방법을 통해 속성을 수정하는 목적을 달성할 수 있다
from django.conf.urls import patterns, url, include

from django.views.generic import TemplateView

urlpatterns = patterns('',

    (r'^about/', TemplateView.as_view(template_name="about.html")),

)

객체의 일반 뷰
일단 저희가 쓸 수 있는 모델이에요.
# models.py

from django.db import models

class Publisher(models.Model):

    name = models.CharField(max_length=30)

    address = models.CharField(max_length=50)

    city = models.CharField(max_length=60)

    state_province = models.CharField(max_length=30)

    country = models.CharField(max_length=50)

    website = models.URLField()

    class Meta:

        ordering = ["-name"]

    def __unicode__(self):

        return self.name

class Book(models.Model):

    title = models.CharField(max_length=100)

    authors = models.ManyToManyField('Author')

    publisher = models.ForeignKey(Publisher)

    publication_date = models.DateField()

모든 출판사의 페이지를 만들기 위해서 url에 이렇게 쓸 수 있습니다
from django.conf.urls import patterns, url, include

from django.views.generic import ListView

from books.models import Publisher

urlpatterns = patterns('',

    (r'^publishers/$', ListView.as_view(

        model=Publisher,

    )),

)

여기서 템플릿 이름을 지정하지 않았습니다. ListView 기본 템플릿 이름 기본 템플릿을 사용합니다.label>/_list.html, 여기는/books/publisherlist.html
공통 뷰 확대
제작 친선 템플릿 컨텍스트 이름
만약 당신이 모델과 접촉하고 있다면, 아래의 설정을 사용하면 더 좋은 (django 내부에 규칙적으로 생성된) 템플릿 상하문 이름을 스스로 정의할 수 있습니다. 이것은 당신과 합작한 템플릿 디자이너가 당신에게 호감을 가지게 할 수 있습니다. 왜냐하면 때로는django가 자동으로 생성한 템플릿 상하문 이름이 지루하기 때문입니다.
urlpatterns = patterns('',

    (r'^publishers/$', ListView.as_view(

        model=Publisher,

        context_object_name="publisher_list",

    )),

)

컨텍스트 추가
때때로 기본적인 유니버설 보기가 제공하는 상하문 내용이 당신의 요구를 충족시키지 못할 때가 있습니다. 예를 들어 모든 출판사의 목록을 되돌려주는 페이지는 위에 책과 정보가 전혀 없을 수도 있습니다. 이럴 때 당신은 상응하는 부류를 계승하고 부류를 덮어쓰는 방법으로 부류에 추가 내용을 추가할 수 있습니다.
from django.views.generic import DetailView

from books.models import Publisher, Book

class PublisherDetailView(DetailView):

    context_object_name = "publisher"

    model = Publisher

    def get_context_data(self, **kwargs):

        # Call the base implementation first to get a context

        context = super(PublisherDetailView, self).get_context_data(**kwargs)

        # Add in a QuerySet of all the books

        context['book_list'] = Book.objects.all()

        return context

객체 보기 하위 세트
모델 속성과queryset 속성, 모델=Publisher,queryset=Publisher.objects.all()는 기본적으로 일치한다. 이 점을 바탕으로queryset의 방법을 제정하여 매번 한 모델의 전체 집합을 되돌려받지 않고 매번 하위 집합만 되돌려줄 수 있다. 물론 우리는 url에서 이 목표를 달성할 수 있다.
urlpatterns = patterns('',

    (r'^publishers/$', ListView.as_view(

        queryset=Publisher.objects.all(),

        context_object_name="publisher_list",

    )),

    (r'^books/$', ListView.as_view(

        queryset=Book.objects.order_by("-publication_date"),

        context_object_name="book_list",

    )),

)
from django.views.generic import ListView

from books.models import Book

class AcmeBookListView(ListView):

    context_object_name = "book_list"

    queryset = Book.objects.filter(publisher__name="Acme Publishing")

    template_name = "books/acme_list.html"

동적 필터
또 하나의 상용 수요는 url의 매개 변수에 따라 데이터베이스를 조회하는 것이다. 이전에 우리는 출판사의 이름을 url에 하드코딩할 수 있었다. 그러나 만약에 우리가 임의로 정해진 출판사에 따라 출판사의 모든 책을 되돌릴 수 있는 보기를 쓰려고 한다면?우리는 get 을 덮어쓸 수 있다queryset () 이 방법
    def get_queryset(self):

        publisher = get_object_or_404(Publisher, name__iexact=self.args[0])

        return Book.objects.filter(publisher=publisher)

추가 작업 수행
만약 Author 이 모형에 last 가 있다면accessed의date 형식 속성입니다. 방문할 때마다 이 속성을 업데이트해야 합니다. 분명히django의 일반적인 보기는 Author에 이런 속성이 있는지 전혀 모릅니다. 따라서 이 행동을 늘리기 위해 어떤 방법을 다시 써야 합니다. 여기는 getobject() 메서드
import datetime

from books.models import Author

from django.views.generic import DetailView

from django.shortcuts import get_object_or_404

class AuthorDetailView(DetailView):

    queryset = Author.objects.all()

    def get_object(self):

        # Call the superclass

        object = super(AuthorDetailView, self).get_object()

        # Record the last accessed date

        object.last_accessed = datetime.datetime.now()

        object.save()

        # Return the object

        return object

장식 클래스 기반 보기
url에 장식
from django.contrib.auth.decorators import login_required, permission_required

from django.views.generic import TemplateView

from .views import VoteView

urlpatterns = patterns('',

    (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),

    (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),

)

클래스에서 장식
from django.contrib.auth.decorators import login_required

from django.utils.decorators import method_decorator

from django.views.generic import TemplateView

class ProtectedView(TemplateView):

    template_name = 'secret.html'

    @method_decorator(login_required)

    def dispatch(self, *args, **kwargs):

        return super(ProtectedView, self).dispatch(*args, **kwargs)

p

좋은 웹페이지 즐겨찾기