Django 클래스 보기(3) 내장 클래스 일반 보기
홈페이지 링크:https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-display/
Django 1.11용
웹 응용 프로그램을 실행하는 것은 항상 어떤 패턴을 반복하기 때문에 단조로울 수 있다.Django는 모델 층과 템플릿 층에서 단조로움을 줄이려 했지만 웹 개발자들은 보기 층에서도 지루함을 느낄 것이다.
Django 유니버설 뷰는 이런 고통을 줄일 수 있기를 바란다.그들은 보기 개발 과정에서 자주 사용하는 습어와 모델을 정리하여 너무 많은 코드를 작성하지 않아도 데이터의 자주 사용하는 보기를 신속하게 실현할 수 있도록 추상화했다.
우리는 대상 목록을 표시하고 임의의 대상 목록을 표시하는 코드를 작성하는 등 일반적인 작업을 식별할 수 있다.그런 다음 URLconf로 모델을 추가 매개변수로 가져옵니다.
Django는 다음 기능을 위해 일반 뷰를 게시합니다.
4
4
4
요컨대, 이러한 보기는 개발자가 만나는 가장 흔히 볼 수 있는 임무에 편리한 인터페이스를 제공한다.
공통 뷰 확장
유니버설 뷰를 사용하면 개발 속도가 빨라질 것이라는 것은 의심의 여지가 없다.그러나 대부분의 프로젝트에서 일반적인 보기는 충분하지 않다.사실 새로운 Django 개발자들이 가장 자주 겪는 문제는 유니버설 보기를 어떻게 사용하여 더욱 광범위한 문제를 처리하는가이다.
1.3 버전에서 일반 뷰를 다시 디자인한 이유 중 하나이기도 합니다.이전에 그것들은 사람을 현혹시키는 대량의 옵션을 가진 보기 함수일 뿐이었다.현재 추천하는 일반적인 보기를 확장하는 방법은 그것들의 하위 클래스를 만들고 그 속성이나 방법을 덮어쓰는 것이지, URLconf에 대량의 설정 파라미터를 전송하는 것이 아니다.
즉, 일반 뷰에는 제한이 있습니다.보기를 유니버설 보기의 하위 클래스로 사용할 수 있으나, 자신이 필요로 하는 코드만 쓰는 것이 효율이 높다면, 클래스 보기나 함수 보기를 직접 작성하십시오.
일부 제3자 응용 프로그램은 더 많은 일반적인 보기 예시를 제공하고 필요에 따라 자신의 보기를 작성할 수 있다.
객체의 일반 뷰
TemplateView는 물론 유용하지만 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): # __unicode__ on Python 2
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): # __unicode__ on Python 2
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author')
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
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()),
]
이것은 우리가 써야 할 모든 파이톤 코드입니다.그러나, 우리는 여전히 템플릿을 써야 한다.보기를 위한templatename 속성은 보기에서 어떤 템플릿을 사용하는지 명확하게 알려 줍니다. 명확한 템플릿이 없는 상황에서 Django는 대상의 이름에 따라 추정합니다.위의 예에서 추정된 템플릿은'books/publisher list.html'-'books'부분에서 모델의 응용 프로그램 이름을 사용자 정의하고'publisher'는 모델 이름의 소문자 형식일 뿐입니다.
참고: TEMPLATES에서 DjangoTemplates 백엔드의 APPDIRS 옵션이 True로 설정된 경우 템플릿 위치는/path/to/project/books/templates/books/publisherlist.html.
이 템플릿은 모든 출판사 객체를 포함하는 Objectlist 변수의 내용을 렌더링합니다.다음은 매우 간단한 템플릿입니다.
{% extends "base.html" %}
{% block content %}
Publishers
{% for publisher in object_list %}
- {{ publisher.name }}
{% endfor %}
{% endblock %}
이게 정말 모든 일이야.공통 뷰의 모든 멋진 기능은 공통 뷰의 속성을 변경하는 데서 나온다.유니버설 보기 참고 문서에는 모든 유니버설 보기와 옵션이 상세하게 기록되어 있다.이 문서의 나머지 부분은 일반적인 보기를 사용자 정의하고 확장하는 일반적인 방법입니다.
"친선적인"템플릿 내용 만들기
위의publisher 목록 템플릿이object 에 있음을 알 수 있습니다list에 모든publisher가 저장되어 있습니다.비록 이렇게 하는 것은 매우 좋지만, 이것은 템플릿 작성자에게 결코 그렇게 우호적이지 않다. 그들은 반드시 여기에서 출판사를 처리해야 한다.
만약 네가 모델 대상을 처리하고 있다면, 너의 일은 이미 완성되었다.개체나queryset을 처리할 때 Django는 모델 클래스 이름의 소문자로 내용을 채울 수 있습니다.기본 Object 제외list, 똑같은 데이터를 포함하는 다른 내용 (예:publisher list) 을 제공합니다.
여전히 일치하지 않으면 내용 변수의 이름을 수동으로 설정할 수 있습니다.공통 보기의 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 일반 보기는publisher에 내용을 제공하지만, 어떻게 템플릿에서 다른 정보를 얻습니까?
답은 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):
# Call the base implementation first to get a context
context = super(PublisherDetail, self).get_context_data(**kwargs)
# Add in a QuerySet of all the books
context['book_list'] = Book.objects.all()
return context
주의 통상적으로 getcontext_데이터는 모든 부류의 내용 데이터를 현재 클래스의 내용 데이터로 융합시킬 것입니다.내용을 변경하고자 하는 클래스에서 부모 클래스를 보존하려면 슈퍼 클래스에서 get 를 호출해야 합니다context_data.두 종류가 같은 키를 정의하려고 시도하는 상황이 존재하지 않을 때, 이것은 예상한 결과를 나타낼 것이다.단, 모든 클래스가 부모 설정의 키를 다시 쓰려고 시도할 때 (슈퍼를 호출한 후), 모든 부모 클래스를 덮어쓰려면, 이 클래스의 모든 하위 클래스도 슈퍼 다음에 현식으로 설정해야 한다.문제가 발생하면 보기의 방법 해석 순서를 보십시오.또 다른 고려 요소는 클래스가 통용하는 보기의 내용 데이터는 내용 처리기에서 제공한 데이터를 다시 쓰는 것이다. 자세한 것은 get 참조.context_데이터 ()가 제공하는 예입니다.
객체 하위 세트 뷰
이제 모델 매개변수를 가까이서 살펴보겠습니다.보기 조작 데이터 모델을 지정하는 모델 매개 변수는 단일 대상이나 대상 집합을 조작하는 모든 일반적인 보기에 사용할 수 있습니다.그러나 모델 매개 변수는 보기 조작 대상을 지정하는 유일한 방법이 아니며,queryset 매개 변수를 사용하여 대상 목록을 지정할 수도 있습니다.
from django.views.generic import DetailView
from books.models import Publisher
class PublisherDetail(DetailView):
context_object_name = 'publisher'
queryset = Publisher.objects.all()
모델 = Publisher 설정은query set=Publisher입니다.objects.all ()의 약자입니다.그러나queryset을 사용하여 대상을 정의하는 필터 목록을 사용하면 보기에서 볼 수 있는 대상을 더욱 구체적으로 지정할 수 있습니다. (QuerySet 대상에 대한 더 많은 정보는 조회를 참고하고, 완전한 상세한 정보는 기본 클래스의 보기 참조를 참조하십시오.)간단한 예를 들어 우리는 발표 날짜에 따라 도서 목록을 주문하기를 희망할 수 있다. 첫 번째는 최신 도서이다.
from django.views.generic import ListView
from books.models import Book
class BookList(ListView):
queryset = Book.objects.order_by('-publication_date')
context_object_name = 'book_list'
이것은 상당히 간단한 예이지만, 그것은 사고방식을 잘 설명한다.물론 우리가 자주 해야 할 일은 대상을 정렬하는 것만은 아니다.지정된 출판사의 책 목록을 표시하려면 다음과 같은 기술을 사용할 수 있습니다.
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'
queryset 이외에 사용자 정의 템플릿 이름을 사용했습니다.사용자 정의 템플릿 이름이 정의되지 않으면, 일반 보기에서는 'vanilla' 대상 목록과 같은 템플릿을 사용합니다. (이것은 우리가 원하는 것이 아닐 수도 있습니다.)
출판사 전문 서적을 우아하게 열거하는 방식이 아니라는 점도 주의해야 한다.만약 우리가 다른 출판사 페이지를 추가하려고 한다면, URLconf에 다른 줄을 추가합니다. 많은 출판사가 있다면 처리하기 어려울 것입니다.우리는 다음 절에서 이 문제를 처리할 것이다.
주의:/book/acme/를 요청할 때 404로 돌아오면 "ACME Publishing"이라는 출판사가 있는지 확인해야 합니다. 일반적인 보기에는 allow empty 파라미터가 있습니다. 이 경우 클래스 보기에서 참고하십시오.
동적 필터
또 다른 일반적인 요구 사항은 URL의 일부 키로 목록 페이지에 표시된 대상을 필터하는 것입니다.이전에 우리는 URLconf에서 출판사의 이름을 하드코딩했지만, 임의의 출판사의 모든 책을 보여 주는 보기를 쓰고 싶다면?
편리합니다. ListView에 덮어쓸 수 있는 get 이 있습니다.queryset () 방법입니다.이전에는queryset 속성의 값만 되돌려 주었지만, 지금은 더 많은 논리를 추가할 수 있습니다.
이 작업을 실현하는 관건은 클래스 보기를 호출할 때 유용한 내용을self에 저장하는 데 있다.그것은 요청 (self.request), URLconf에 따라 얻은 위치 매개 변수 (self.args), 이름 매개 변수 (self.kwargs) 를 포함한다.
단일 그룹을 갖는 URLconf가 있습니다.
# 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)
보시다시피queryset에 더 많은 논리를 추가하는 것은 매우 간단합니다.만약 우리가 원한다면, 우리는self를 사용할 것이다.request.사용자가 현재 사용자를 필터하거나 더 많은 복잡한 논리를 사용합니다.
또한 출판사를 컨텐트에 추가하여 템플릿에서 사용할 수 있습니다.
# ...
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(PublisherBookList, self).get_context_data(**kwargs)
# Add in the publisher
context['publisher'] = self.publisher
return context
추가 작업 수행
마지막으로 흔히 볼 수 있는 모델은 일반적인 보기를 호출하기 전이나 이후에 추가 작업을 실현하는 것이다.
상상해봐, Author 모형 중 하나의lastaccessed 필드는 작성자를 최근에 본 시간을 추적하는 데 사용됩니다.
# models.py
from django.db import models
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')
last_accessed = models.DateTimeField()
물론 유니버설 DetailView 클래스는 이 필드의 정보를 알지 못하지만, 사용자 정의 보기를 써서 이 필드를 업데이트할 수 있습니다.먼저 사용자 정의 뷰를 가리키는 작성자 세부 정보 섹션을 URLconf에 추가해야 합니다.
from django.conf.urls import url
from books.views import AuthorDetailView
urlpatterns = [
#...
url(r'^authors/(?P[0-9]+)/$', AuthorDetailView.as_view(), name='author-detail'),
]
다음에 우리는 새로운 보기를 쓸 것입니다. (get object는 대상을 얻는 방법입니다.) 호출을 다시 쓰고 봉인하기만 하면 됩니다.
from django.views.generic import DetailView
from django.utils import timezone
from books.models import Author
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 = timezone.now()
object.save()
# Return the object
return object
주의: 이 URLconf는 이름 그룹 pk를 사용합니다. 이것은 DetailView에서 검색 집합을 찾을 때 사용하는 키의 기본 이름입니다.
그룹의 다른 내용을 호출하려면 보기에서 pk 를 설정할 수 있습니다url_kwarg. 자세한 내용은 DetailView에서 확인할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.