Django 12편-----공통 보기

5971 단어 Django

 
공통 뷰란?
유니버설 보기는 보기 개발에서 자주 사용하는 쓰기와 패턴을 추상화하여 소량의 코드를 작성하면 흔히 볼 수 있는 데이터 보기를 신속하게 실현할 수 있다.객체 목록을 표시하는 작업은 다음과 같습니다.
일반 뷰가 있으면 URL 구성에 모델을 추가 매개변수로 전달할 수 있습니다.Django의 공통 뷰는 다음과 같은 기능을 제공합니다.
• 객체를 나열하고 개별 객체에 대한 세부내용을 표시합니다.회의를 관리하는 프로그램을 만들면 TalkListView와 Reg-isteredUserListView가 목록 보기입니다.어떤 강연의 페이지는 상세한 정보 보기입니다.날짜 기반 객체를 렌더링하고 세부 정보가 포함된 연월일 아카이브 페이지와 최신 페이지를 표시합니다. •사용자가 객체를 작성, 업데이트 및 삭제할 수 있도록 허용 없이
객체의 일반 뷰
보기에서 데이터베이스 안의 내용을 나타낼 때 Django의 일반적인 보기가 얼마나 강한지 가장 잘 나타낼 수 있다.이것은 매우 흔히 볼 수 있는 임무이기 때문에 Django는 이 방면의 일반적인 보기를 많이 만들었고 먼지를 털지 않아도 대상 목록과 상세한 정보 보기를 만들 수 있다.
다음은 몇 가지 예를 들자.다음과 같은 모델을 사용합니다.
# 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 __str__(self):
        return self.name
class Author(models.Model):
    salutation = models.CharField(max_length=10)
    name = models.CharField(max_length=200)
    email = models.EmailField()
    headshot = models.ImageField(upload_to='author_headshots')
    def __str__(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()    



그런 다음 뷰를 정의합니다.
# views.py
from django.views.generic import ListView
from books.models import Publisher
class PublisherList(ListView):
    model = Publisher

마지막으로 보기와 URL을 연결합니다.
# urls.py
from django.conf.urls import url
from books.views import PublisherList
urlpatterns = [
    url(r'^publishers/$', PublisherList.as_view()),
]

이것이 바로 우리가 작성해야 할 모든 파이톤 코드입니다.물론 템플릿도 작성해야 한다.우리는 보기를template 추가할 수 있습니다name 속성, 어떤 템플릿을 사용하는지 명확하게 가리키기;명시적으로 지정되지 않은 경우 Django는 객체의 이름에서 알 수 있습니다.여기, 추정되는 템플릿은 북스/publisherlist.html, 그 중에서'books'는 모델이 응용하는 이름이고'publisher'는 모델 이름의 소문자 형식이다.
따라서 TEMPLATES 설정에서 Django Templates 백그라운드의 APPDIRS 옵션을 True로 설정하면 이 템플릿의 위치는/path/to/project/books/templates/books/publisherlist.html .
이 템플릿을 렌더링할 때, 상하문에 Object 라는 이름이 있습니다.list의 변수, 그 값은 모든 출판사의 대상입니다.다음은 매우 간단한 템플릿입니다.
{% extends "base.html" %}
{% block content %}

Publishers

    {% for publisher in object_list %}
  • {{ publisher.name }}
  • {% endfor %}
{% endblock %}

친선 템플릿 컨텍스트 제공
상기 출판사 목록 템플릿 예시에서 모든 출판사를 Object 라고 저장한 것을 알 수 있습니다list의 변수 중.이렇게 하면 되지만 템플릿 작성자에게 우호적이지 않다. 그들이 알고 싶은 것은 출판사를 처리하는 것이다.만약 모델 대상을 처리한다면, Django는 이미 당신에게 이러한 변수를 제공했습니다.객체 또는 질의 컬렉션을 처리할 때 모델 클래스 이름 소문자로 지정된 변수가 컨텍스트에 추가됩니다.이 변수와 Objectlist가 동시에 존재하지만, 포함된 데이터는 완전히 같습니다.여기, 변수 이름은publisherlist . 만약 이것이 부족하다면, 상하문 변수의 이름을 스스로 설정할 수 있다.공통 보기의 contextobject_name 속성은 사용할 컨텍스트 변수 이름을 지정하는 데 사용됩니다.
# views.py
from django.views.generic import ListView
from books.models import Publisher
class PublisherList(ListView):
    model = Publisher
    context_object_name = 'my_favorite_publishers'

는 context 입니다.object_name 우호적인 값을 설정하면 항상 좋습니다. 템플릿을 디자인하는 동료가 당신에게 감사할 것입니다.
추가 컨텍스트 변수 제공
일반적으로 일반적인 보기에서 제공하는 정보 외에 추가 정보를 표시하려고 한다.예를 들어 각 출판사의 상세한 정보 페이지에 출판된 도서 목록을 표시한다.DetailView 유니버설 보기는 상하문에서 출판사 정보를 제공하지만, 템플릿에서 추가 정보를 얻는 방법은 무엇입니까?답은 DetailView 확장, get 자체 구현context_데이터 방법.기본 구현은 템플릿에 표시되는 객체만 제공하지만 덮어쓰고 추가 정보를 제공할 수 있습니다.
from django.views.generic import DetailView
from books.models import Publisher, Book
class PublisherDetail(DetailView):
    model = Publisher
    def get_context_data(self, **kwargs):
        #         ,     
        context = super(PublisherDetail, self).get_context_data(**kwargs)
        #                    
        context['book_list'] = Book.objects.all()
        return context

객체 하위 세트 표시
특정 출판사에서 출판한 도서 목록을 보여주려면 이 기술을 사용해도 된다.
from django.views.generic import ListView
from books.models import Book
class AcmeBookList(ListView):
    context_object_name = 'book_list'
    queryset = Book.objects.filter(publisher__name='Acme Publishing')
    template_name = 'books/acme_list.html'

동적 필터
또 다른 일반적인 요구 사항은 URL에 지정된 키를 기반으로 목록 페이지의 객체를 필터링하는 것입니다.앞에서 URL 설정에서 출판사의 이름을 하드코딩합니다. 그러나 만약 우리가 보기를 작성해서 임의의 출판사 산하의 모든 도서를 표시하고 싶다면?이것 또한 매우 편리하다. 우리는 ListView의 get 를 덮어쓸 수 있다queryset () 방법입니다.그것의 기본 구현은queryset 속성의 값을 되돌려 주는 것이지만, 우리는 더 많은 논리를 추가할 수 있습니다.클래스 기반 보기를 호출할 때 많은 유용한 것들이 self에 저장됩니다. 요청 (self.request) 을 제외하고 URL 설정에 따라 포획된 위치 파라미터 (self.args) 와 키워드 파라미터 (self.kwargs) 도 있습니다.
다음 URL 구성에는 캡처 그룹이 하나만 있습니다.
# urls.py
from django.conf.urls import url
from books.views import PublisherBookList
urlpatterns = [
    url(r'^books/([\w-]+)/$', PublisherBookList.as_view()),
]

그런 다음 PublisherBookList 뷰 클래스를 작성합니다.
# views.py
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from books.models import Book, Publisher
class PublisherBookList(ListView):
    template_name = 'books/books_by_publisher.html'
    def get_queryset(self):
        self.publisher = get_object_or_404(Publisher, name=self.args[0])
        return Book.objects.filter(publisher=self.publisher)

조회 집합에 논리를 추가하는 것은 상당히 쉽다는 것을 알 수 있다.필요하면self를 사용할 수 있습니다.request.사용자는 현재 사용자를 통해 필터를 하거나 더 복잡한 논리를 실현합니다.또한 출판사 객체를 컨텍스트에 추가하여 템플릿을 사용할 수 있습니다.
# ...
def get_context_data(self, **kwargs):
    #         ,     
    context = super(PublisherBookList, self).get_context_data(**kwargs)
    #        
    context['publisher'] = self.publisher
    return context ##        

좋은 웹페이지 즐겨찾기