Python學習之路-隨筆04 小插曲之Django通用視圖

雖然欠了攢了好幾篇沒寫,可是這個要寫先記下來,太零碎了容易忘html

函數視圖

一路看過來通常用法無非是ide

1.HttpResponse函數

2.renderthis

3.render_to_responseurl

而後看到一個通用視圖能夠解決部分代碼冗餘問題。可是一開始看例子一臉懵逼(可能我找到的都是不愛寫註釋的人的文章)spa

心裏:這啥呀?怎麼就拿到數據了?怎麼拿的?何時就傳過去了呀?code

好比這樣,還須要改一下urls,改個pk主鍵上去就行orm

class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        return Question.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date')[:5]

而後一頭霧水htm

ListView

找了半天,在list.py裏找到了一些端倪,首先是下面這個類blog

class MultipleObjectMixin(ContextMixin):
    """
    A mixin for views manipulating multiple objects.
    """
    allow_empty = True
    queryset = None
    model = None
    paginate_by = None
    paginate_orphans = 0
    context_object_name = None
    paginator_class = Paginator
    page_kwarg = 'page'
    ordering = None

這個類是根據get_queryset的指引找來的,繼承自這個Mixin,發現這堆參數。結合羣衆的智慧,好了不瞎扯了

裏面的template_name指定模板名稱,context_object_name指定上下文變量,也就是要套入模板中的數據,而後還有一個就是model,數據來源,若是指定了model

那麼該通用視圖就變成了至關於model.objects.all(),從這個模型裏把數據都拿出來,這樣不是很好用,不友好。因此它給了一個get_queryset的方法來自定義上下文變量

默認的是下面這樣,重寫一下用就好了

    def get_queryset(self):
        """
        Return the list of items for this view.

        The return value must be an iterable and may be an instance of
        `QuerySet` in which case `QuerySet` specific behavior will be enabled.
        """
        if self.queryset is not None:
            queryset = self.queryset
            if isinstance(queryset, QuerySet):
                queryset = queryset.all()
        elif self.model is not None:
            queryset = self.model._default_manager.all()
        else:
            raise ImproperlyConfigured(
                "%(cls)s is missing a QuerySet. Define "
                "%(cls)s.model, %(cls)s.queryset, or override "
                "%(cls)s.get_queryset()." % {
                    'cls': self.__class__.__name__
                }
            )
        ordering = self.get_ordering()
        if ordering:
            if isinstance(ordering, six.string_types):
                ordering = (ordering,)
            queryset = queryset.order_by(*ordering)

        return queryset
View Code

其餘的方法用到再從新寫

而後是

TemplateView

用法是通常只在須要返回一個模板的時候用,指定一下template_name就行,待補充。

DetailView

對比ListView和DetailView二者,ListView用來獲取model中的全部數據,而DetailView是得到某個數據的詳細信息,好比一張試卷,前者得到試卷的名稱之類的簡要信息,後者獲取試卷的題目等詳細信息

用這個就用到上面說的須要在urls改爲傳遞主鍵值來進行查詢。

參數也有這麼一堆

class SingleObjectMixin(ContextMixin):
    """
    Provides the ability to retrieve a single object for further manipulation.
    """
    model = None
    queryset = None
    slug_field = 'slug'
    context_object_name = None
    slug_url_kwarg = 'slug'
    pk_url_kwarg = 'pk'
    query_pk_and_slug = False

其中pk_url_kwarg就是主鍵,而後裏面有一個相似ListView中get_queryset的方法叫get_object。用法也相似

而後都有的添加額外的信息(模型之外的數據)的方法叫get_context_data。

而後相似的通用視圖還有CreateView,UpdateView,FormView,DeleteView。。。做用嘛,看名字就行了

待補充吧。。。

相關文章
相關標籤/搜索