Как конвертировать FBV в ListView в Django - PullRequest
1 голос
/ 11 февраля 2020

Я хочу преобразовать функцию FBV в ListView.
Но я не знаю, как обращаться со значением слизняка.

Как получить значение slug в ListView?

view.py

def category(request, slug=None):
    current_ct = None
    categories = Category.objects.all()
    products = Product.objects.filter(ready=True)

    if slug:
        current_ct = get_object_or_404(Category, slug=slug)
        products = products.filter(category=current_ct)

    return render(request, 'home.html', {'current_ct': current_ct, 'categories': categories, 'products': products})

url.py

path('category/<slug>/', category, name="test"),

get_absolute_url ( ) в model.py

def get_absolute_url(self):
    return reverse("test", kwargs={"slug": self.slug})

1 Ответ

1 голос
/ 11 февраля 2020

Вы можете получить доступ к параметрам, переданным вызову, с помощью self.args (для позиционных параметров) и self.kwargs (для именованных параметров).

При этом, если вы используете DetailView [Django -doc] , вам не нужно , чтобы сделать это самостоятельно. Действительно, DetailView и все другие представления на основе классов, использующие SingleObjectMixin [Django -doc] , будут искать slug и pk в этих параметры и выполнять фильтрацию автоматически.

Таким образом, мы можем сделать его DetailView следующим образом:

class CategoryDetailView(DetailView):
    model = Category
    context_object_name = 'current_ct'
    template_name = 'home.html'

    def <b>get_context_data</b>(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context.update(
            categories=Category.objects.all(),
            products=self.object.product_set.filter(ready=True)
        )
        return context

Здесь, переопределив .get_context_data(..) Метод [Django -doc] , поэтому мы добавляем дополнительные элементы в контекст, который мы передаем при рендеринге шаблона.

...