Django не получает объекты из URL slug

#python #django #django-models #django-views

#python #django #django-модели #django-просмотры

Вопрос:

Я пытаюсь сделать так, чтобы я мог показывать только краткие сведения с именем slug в качестве категории, однако это не работает.

На данный момент я могу использовать его, только показывая все краткие сведения, используя .objects.all() однако это не подходит для моего желаемого варианта использования.

Нужно ли мне также поле slug в разделе brief?

Models.py

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

    class Meta:
        verbose_name_plural = 'categories'
        verbose_name = 'category'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('browse')


class Brief(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    brandname = models.CharField(max_length=28)
    description = models.CharField(max_length=200)
    date = models.DateTimeField(auto_now=True, blank=True)
    category = models.ForeignKey(Category, on_delete=CASCADE)

    def get_absolute_url(self):
        return reverse('homepage')
  

Urls.py

  path('browse/categories/<slug:catslug>/', views.postsinthecategory, name = 'catslug'
  

views.py

 def postsinthecategory(request, catslug):
    categories = Category.objects.all()
    brief = Brief.objects.all()
    if catslug:
        category = get_object_or_404(Category, slug = catslug)
        brief = Brief.objects.get(category=catslug)
    template = 'users/categoryposts.html'
    context = {'categories': categories, 'brief': brief, 'category': category}
    return render(request, template,context)
  

Ответ №1:

Вы можете использовать __slug для фильтрации по slug полю соответствующей модели. Используйте filter вместо get , потому что вам нужен набор запросов, который может содержать более brief . Я бы переименовал brief в briefs , на ваш взгляд, чтобы сделать это более понятным.

 briefs = Brief.objects.filter(category__slug=catslug)
  

Или, поскольку вы выбрали категорию в предыдущей строке, вы могли бы сделать:

 category = get_object_or_404(Category, slug = catslug)
briefs = Brief.objects.filter(category=category)
  

Комментарии:

1. Это должно быть filter не get , потому что для каждой категории может быть несколько кратких описаний. Исправлено.