AttributeError; Динамический URL для списка диаграмм по категориям (фильтр наборов запросов) - PullRequest
0 голосов
/ 16 января 2019

У объекта Django 'CategoryorisedListView' нет атрибута 'slug' или страница не найдена (ошибка 404).

Я нахожусь на Django 2.0, использую общий список классов. Я пробовал динамический URL, основанный на слаге и фильтре наборов запросов на слаге, чтобы получить список диаграмм по категориям.

Пожалуйста, помогите! С тех пор я застрял здесь на пару дней.

views.py

class CategoriesView(generic.ListView):
    template_name = 'Bokeh/categories.html'
    context_object_name = 'all_categories'


    def get_queryset(self):
        return Category.objects.all()

class CategorisedListView(generic.ListView):
    model = Category
    template_name = 'categories/list_of_charts_by_category.html'
    context_object_name = 'categorised'

    def get_queryset(self):
        self.category = get_object_or_404(Category, name = self.kwargs['slug'])
        return Chart.objects.filter(category=self.slug)

models.py

class Category(models.Model):
    name = models.CharField(max_length=100)
    image_file = models.ImageField(default=None, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    parent = models.ForeignKey('self', on_delete=models.PROTECT, blank=True, null=True, related_name='children')

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return '{slug}/'.format(slug=self.slug)
    class Meta:
        ordering = ('name',)
        verbose_name = 'Category'
        verbose_name_plural = 'Categories'



class Chart(models.Model):
    name = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique=True)
    description = models.TextField(max_length=250)
    url = models.URLField(default=None, blank=True)
    embed_url = models.TextField(default=None, blank=True)
    image_file = models.ImageField(default=None, unique=True)
    code_file = models.FileField(default=None, blank=True, unique=True)
    chart_library = models.CharField(max_length=250)
    author = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    tag = TaggableManager()
    category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True)


    def __str__(self):
        return self.name + ' - ' + self.chart_library

    def get_absolute_url(self):
        return reverse('Bokeh:detail', kwargs={'pk': self.pk})

    def read_file(self):
        data = self.code_file.path

        with open(self.code_file.path, 'r', encoding='UTF-8') as data:
            content = data.read()

        return content

    class Meta:
        ordering = ('name',)

urls.py

path("categories/", views.CategoriesView.as_view(), name='categories'),

# /Bokeh/categories/<category_slug>
path("categories/<slug:slug>/", views.CategorisedListView.as_view(), name='list_of_charts_by_category'),

предполагается запрашивать базу данных при нажатии на конкретную категорию и возвращать список диаграмм, относящихся к этой конкретной категории. Тем не менее, страница выбрасывает объект «CategoryorisedListView» не имеет атрибута «slug»

1 Ответ

0 голосов
/ 16 января 2019

Поиск, который вы делаете в get_queryset(), не совсем верен. Во-первых, вы, похоже, ищете Category по имени, а не по слизне. Затем вы пытаетесь отфильтровать Chart s, используя их атрибут category, но вместо передачи категории вы передаете несуществующий атрибут self.slug.

Попробуйте изменить реализацию на это:

def get_queryset(self):
    # Lookup the Category using it's slug attribute, not name, and assign to local variable
    category = get_object_or_404(Category, slug=self.kwargs['slug'])

    # Now lookup the Charts using the category we just looked up
    return Chart.objects.filter(category=category)
...