【问题标题】:class based view django multiple slugs基于类的视图django多个slugs
【发布时间】:2017-01-22 15:11:54
【问题描述】:

我有cbt generic listview 我想用两个蛞蝓过滤。但是slug_url_kwargs 只允许传递单个字符串。如何更新 slug_url_kwarg 以支持多个 slug?或者我还能做什么?

所以我有这个模型和视图功能

class SaityProfile(models.Model):
    user = models.ForeignKey(User, default=0)
    about = models.CharField(max_length=255, blank=True)
    name = models.CharField(max_length=255)
    url = models.CharField(max_length=255, unique=True)

    def __unicode__(self):
        return self.name 

class Saity(models.Model):
    profile = models.ForeignKey('SaityProfile', null=True)
    user = models.ForeignKey(User, null=True)
    name = models.CharField(max_length=250)
    url = models.CharField(max_length=250, default=gen_slug_page)
    desc = models.CharField(max_length=250, blank=True)
    order = models.IntegerField(default=1)

    def get_absolute_url(self):
        return reverse('sites:website_pages', kwargs={'website_slug': self.url})

class WebsitesProfileList(generic.ListView):
    model = Saity
    slug_field = 'url'
    slug_field_kwargs = 'profile_url'
    template_name = 'saity_ds/websites_profile_list.html'

    def get_context_data(self, **kwargs):
        self.profile = SaityProfile.objects.get(url=self.kwargs['profile_url'])
        extra_context = {
            'profile': self.profile 
        }
        context =  super(WebsitesProfileList, self).get_context_data(**kwargs)
        context.update(extra_context)
        return context

我的代码看起来像这样。我想添加新功能。我选择了基于类的视图,我认为这是我的错误,因为不清楚

【问题讨论】:

  • ListView 根本不使用slug_url_kwarg。请edit您的问题包含更多信息,例如您的 URL 模式、模型以及您要过滤的字段。
  • 谢谢,我的意思是 urlconf 上的 slug,如果我有两个 slug 并且我想基于 slugs kwargs 进行过滤怎么办?
  • 你没有像我问的那样在你的问题中添加更多信息。如果它包含您的模型、slug 字段的名称、url 模式以及您迄今为止为您的视图尝试过的任何内容,那么回答您的问题会容易得多。如果您不包含该信息,那么您就是在要求我们发明示例。这使得回答变得更加困难,因此您可能不会收到任何回复。
  • 好的,我添加了我的模型和视图

标签: django django-class-based-views


【解决方案1】:

您根本不需要设置slug_url_kwarg。只需覆盖 get_queryset 并返回您希望视图显示的查询集。

class WebsitesProfileList(generic.ListView):
    def get_queryset(self):
        return Saity.objects.filter(url=self.kwargs['url'], profile=self.kwargs['profile'])  # You will probably have to change this
    ...

【讨论】:

  • 梦想简洁的短配置,害怕超级功能
  • 是的,我知道如何添加和使用过滤器。我不喜欢重写方法,我认为它有干净的方式
  • 覆盖 get_queryset 是基于 Django 通用类的视图中的 standard techniqueListView 根本没有 slug_field_kwarg 选项,所以在这种情况下我想不出另一种方法。在我的示例中无需调用super(),您明确调用Saity.objects.filter()(如果需要,您可以调整示例以使用super())。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2014-02-16
  • 2016-08-23
  • 2018-05-14
  • 2014-02-21
  • 2011-11-15
相关资源
最近更新 更多