【问题标题】:Python Django request.GET.get method for urls with if statements带有 if 语句的 url 的 Python Django request.GET.get 方法
【发布时间】:2020-03-23 01:26:47
【问题描述】:

我想按学校和类别这两个不同的类别过滤帖子。

models.py

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

class School(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'school'
        verbose_name_plural = 'schools'

    def __str__(self):
        return self.name


class VideoPost(models.Model):
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    school = models.ForeignKey('School', on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique = True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    video = models.CharField(max_length=100, blank=True)
    content = RichTextUploadingField()
    image = models.ImageField(upload_to='images', null=True, blank=True)
    date_posted = models.DateTimeField(default=timezone.now)

    def _get_unique_slug(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(VideoPost, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.title

SchoolCategoryVideoPost 的外键。因此,在 db 中它只有它的 id,而不是 slug 或名称。是category_id & school_id

views.py

def post_list(request):
    school = request.GET.get('school', None)
    category = request.GET.get('category', None)

    posts = VideoPost.objects.all()

    if school:
        posts.filter(school=school).order_by('-date_posted')

    elif category:
        posts.filter(category=category).order_by('-date_posted')

    elif school & category:
         posts.filter(school=school).filter(category=category).order_by('-date_posted')
    else:
        posts.order_by('-date_posted')

## I wanted to filter them in multiple ways where the posts are filtered by either one of the category, or both, but It doesn't work.
## The only way I found that's working is:

   posts = VideoPost.objects.all().filter(school=school).filter(category=category)
##This way, it filtered the posts with its school and category id specified.

    return render(request, 'stories/browse.html', {'posts': posts})

模板.html

<a href="{% url 'post_list' %}?school=1&category=4">Link</a>

所以,我的问题是

  1. 是否可以在数据库中为外键提供文本?这样该 url 可以更具可读性,并且我可以在 url 标签中使用文本。 喜欢&lt;a href="{%url 'post_list' %}?school=MIT&amp;category=sports"&gt;Link&lt;/a&gt;

  2. 如何正确使用带有 IF 语句的 request.GET.get() 方法?

【问题讨论】:

    标签: python django


    【解决方案1】:
    1. 您可以按学校 slug 和类别 slug 过滤VideoPost,您不需要使 slug 字段主键,通常这是一个糟糕的设计。您可以做的是使 slug 字段唯一,这样您就知道没有具有相同 slug 的条目。

    2. 请记住,每个应用于 QuerySet 的过滤器都会返回一个新的 QuerySet,因此您可以创建一个 QuerySet 链。

    以下代码应按预期工作

    school_slug = request.query_params.get('school', None)
    category_slug = request.query_params.get('category', None)   
    
    posts = VideoPost.objects.all()
    
    if school:
        # If we have school, filter by school slug
        posts = posts.filter(school__slug=school_slug)
    if category:
        # If we have category, filter by category slug
        posts = posts.filter(category__slug=category_slug)
    
    # Always order the posts by date_posted
    posts = posts.order_by('-date_posted')
    
    return render(request, 'stories/browse.html', {'posts': posts})
    

    如果 schoolcategory 都通过了,那么我们将 2 个过滤器应用于查询集

    另外,将来我建议在此用例中使用django-filter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2011-12-01
      • 2018-09-23
      • 1970-01-01
      相关资源
      最近更新 更多