LOADING

Follow me

Django Version 1.6 View source analysis about edit.py
九月 9, 2014|IT

Django Version 1.6 View source analysis about edit.py



Source:Django Version 1.6 View source analysis about edit.py

先放在自己网站 现在在这里PO出来希望对大家有些帮助 以前写的 今儿才记得 以后再续吧

from __future__ import unicode_literals


from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist

from django.db import models

from django.http import Http404

from django.utils.translation import ugettext as _

from django.views.generic.base import TemplateResponseMixin, ContextMixin, View


class SingleObjectMixin(ContextMixin):

    “””

    Provides the ability to retrieve a single object for further manipulation.

    “””

    model = None

    queryset = None #直接指明即可 为get_object服务

    slug_field = ‘slug’#配合get_object使用 queryset = queryset.filter(**{slug_field: slug})

    context_object_name = None

    slug_url_kwarg = ‘slug’ # 获得urlconf ?slug=的传输值 用于 pk = self.kwargs.get(self.pk_url_kwarg, None) 配合get_object

    pk_url_kwarg = ‘pk’ #获得urlconf ?pk=的传输值 slug = self.kwargs.get(self.slug_url_kwarg, None) 配合get_object


    def get_object(self, queryset=None): #取得符合条件的obj 条件就是 pk=? 或者 {slug_field: slug}

        “””
首先判断queryset是否存在 若不在则调用get_queryset赋值给queryset
urlconf中的pk或者slug通过pk = self.kwargs.get(self.pk_url_kwarg, None)
和slug = self.kwargs.get(self.slug_url_kwarg, None)获得
之后通过filter()以及get()获得obj

        Returns the object the view is displaying.


        By default this requires `self.queryset` and a `pk` or `slug` argument

        in the URLconf, but subclasses can override this to return any object.

        “””

        # Use a custom queryset if provided; this is required for subclasses

        # like DateDetailView

        if queryset is None:

            queryset = self.get_queryset()


        # Next, try looking up by primary key.

        pk = self.kwargs.get(self.pk_url_kwarg, None)

        slug = self.kwargs.get(self.slug_url_kwarg, None)

        if pk is not None:

            queryset = queryset.filter(pk=pk)


        # Next, try looking up by slug.

        elif slug is not None:

            slug_field = self.get_slug_field()

            queryset = queryset.filter(**{slug_field: slug})


        # If none of those are defined, it’s an error.

        else:

            raise AttributeError(“Generic detail view %s must be called with “

                                 “either an object pk or a slug.”

                                 % self.__class__.__name__)


        try:

            # Get the single item from the filtered queryset

            obj = queryset.get()

        except ObjectDoesNotExist:

            raise Http404(_(“No %(verbose_name)s found matching the query”) %

                          {‘verbose_name’: queryset.model._meta.verbose_name})

        return obj


    def get_queryset(self): # 若queryset为null 则返回self.model._default_manager.all()

        “””

        Get the queryset to look an object up against. May not be called if

        `get_object` is overridden.

        “””

        if self.queryset is None:

            if self.model:

                return 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__

                                        })

        return self.queryset._clone()


    def get_slug_field(self):

        “””

        Get the name of a slug field to be used to look up by slug.

        “””

        return self.slug_field


    def get_context_object_name(self, obj):

        “””
返回的是self.context_object_name 或者 obj._meta.model_name

        Get the name to use for the object.

        “””

        if self.context_object_name:

            return self.context_object_name

        elif isinstance(obj, models.Model):

            return obj._meta.model_name

        else:

            return None


    def get_context_data(self, **kwargs):

        “””
result—>Insert the single object into the context dict.
在self.object=self.get_object()后调用  处理context[‘object’] = self.object context_object_name = self.get_context_object_name(self.object)–>context[context_object_name] = self.object

        Insert the single object into the context dict.

        “””

        context = {}

        if self.object:

            context[‘object’] = self.object

            context_object_name = self.get_context_object_name(self.object)

            if context_object_name:

                context[context_object_name] = self.object

        context.update(kwargs)

        return super(SingleObjectMixin, self).get_context_data(**context)


class BaseDetailView(SingleObjectMixin, View):

    “””

    A base view for displaying a single object

    “””

    def get(self, request, *args, **kwargs):

        self.object = self.get_object()

        context = self.get_context_data(object=self.object)

        return self.render_to_response(context)


class SingleObjectTemplateResponseMixin(TemplateResponseMixin):

    template_name_field = None

    template_name_suffix = ‘_detail’


    def get_template_names(self):

        “””

        Return a list of template names to be used for the request. May not be

        called if render_to_response is overridden. Returns the following list:


        * the value of “template_name“ on the view (if provided)

        * the contents of the “template_name_field“ field on the

          object instance that the view is operating upon (if available)

        * “<app_label>/<model_name><template_name_suffix>.html“

        “””

        try:

            names = super(SingleObjectTemplateResponseMixin, self).get_template_names()

        except ImproperlyConfigured:

            # If template_name isn’t specified, it’s not a problem —

            # we just start with an empty list.

            names = []


            # If self.template_name_field is set, grab the value of the field

            # of that name from the object; this is the most specific template

            # name, if given.

            if self.object and self.template_name_field:

                name = getattr(self.object, self.template_name_field, None)

                if name:

                    names.insert(0, name)


            # The least-specific option is the default <app>/<model>_detail.html;

            # only use this if the object in question is a model.

            if isinstance(self.object, models.Model):

                names.append(“%s/%s%s.html” % (

                    self.object._meta.app_label,

                    self.object._meta.model_name,

                    self.template_name_suffix

                ))

            elif hasattr(self, ‘model’) and self.model is not None and issubclass(self.model, models.Model):

                names.append(“%s/%s%s.html” % (

                    self.model._meta.app_label,

                    self.model._meta.model_name,

                    self.template_name_suffix

                ))


            # If we still haven’t managed to find any template names, we should

            # re-raise the ImproperlyConfigured to alert the user.

            if not names:

                raise


        return names


class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView):

    “””

    Render a “detail” view of an object.


    By default this is a model instance looked up from `self.queryset`, but the

    view will support display of *any* object by overriding `self.get_object()`.

    “””


版权声明:本文为博主原创文章,未经博主允许不得转载。

no comments
Share

发表评论