【问题标题】:In Django class based views how I do I use multiple slugs with slug_url_kwarg在基于 Django 类的视图中,我如何将多个 slug 与 slug_url_kwarg 一起使用
【发布时间】:2020-06-05 09:14:09
【问题描述】:

根据documentation

包含 slug 的 URLConf 关键字参数的名称。默认情况下,slug_url_kwarg'slug'

如何将它用于UpdateView,其中我有两个蛞蝓book_slugchapter_slug?根据this answer,我可以覆盖get_queryset 方法。但是有没有办法在slug_url_kwarg 中使用多个 slug?我试过slug_url_kwarg = ['book_slug', 'chapter_slug'],但它不起作用。

编辑:

我最终覆盖了get_object 方法。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    不,slug_url_kwarg 设计用于接收单个 slug,而不是多个。

    但是,如果您希望能够做到这一点,您可以制作自己的 mixin。

    class MultiSlugMixin:
    
        pk_url_kwarg = 'pk'
        slug_url_kwargs = {'slug': 'slug'}  # {slug_field: slug_url_kwarg}
        query_pk_and_slug = False
    
        def get_object(self, queryset=None):
            if queryset is None:
                queryset = self.get_queryset()
            pk = self.kwargs.get(self.pk_url_kwarg)
            slugs = {
                field: self.kwargs[url_kwarg]
                for field, url_kwarg in self.slug_url_kwargs.items()
            }
            if pk is not None:
                queryset = queryset.filter(pk=pk)
    
            if slugs and (pk is None or self.query_pk_and_slug):
                queryset = queryset.filter(**slugs)
    
            if pk is None and not slugs:
                raise AttributeError(
                    "Generic detail view %s must be called with either an object "
                    "pk or a slug in the URLconf." % self.__class__.__name__
                )
    
            try:
                obj = queryset.get()
            except queryset.model.DoesNotExist:
                raise Http404(_("No %(verbose_name)s found matching the query") %
                              {'verbose_name': queryset.model._meta.verbose_name})
            return obj
    
    
    class ChapterUpdateView(MultiSlugMixin, UpdateView):
    
        model = Chapter
        slug_url_kwargs = {'slug': 'chapter_slug', 'book__slug': 'book_slug'}
    

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 2013-05-01
      • 2014-07-23
      • 1970-01-01
      • 2015-02-25
      • 2019-07-01
      • 2021-01-24
      • 2019-08-29
      • 1970-01-01
      相关资源
      最近更新 更多