Переопределение метода get в представлении на основе классов с помощью super () - PullRequest
0 голосов
/ 05 сентября 2018

Я создал представление, которое управляет продуктами, которые принадлежат текущему пользователю, вошедшему в систему (чтобы текущий пользователь мог просматривать свои собственные продукты):

class ProductList(View):
  def get(self, request, *args, **kwargs):
    products = Product.objects.get(user=self.request.user)
    #...

Я хотел бы выделить из него другое представление, которое управляет продуктами, принадлежащими пользователю, указанному в параметре GET в URL-адресе (возможно, отличающемуся от текущего пользователя). Можно ли сделать это с помощью super () и переопределить метод в product_list? Примерно так:

class ProductListFromUser(ProductList):
   def get(self, request, *args, **kwargs):
     #not sure what code if necessary to put here...
     super().get(self, request, *args, **kwargs): 
     #or here
#...

В основном, как я могу переопределить метод get из product_list, изменяя только "self.request.user" параметром, взятым из URL

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Вы не должны делать ни один из этих.

Если у вас есть представление, которое отображает список элементов, вы должны использовать подкласс ListView. В этом представлении вы можете определить список продуктов в методе get_queryset, который вы можете определить соответствующим образом в двух разных представлениях.

class ProductList(ListView):
  def get_queryset(self, *args, **kwargs):
    return Product.objects.filter(user=self.request.user)

class ProductListFromUser(ListView):
  def get_queryset(self, *args, **kwargs):
    return Product.objects.filter(user__username=self.request.GET['user'])

Вам редко требуется определять get (или post) непосредственно в представлении на основе классов.

0 голосов
/ 05 сентября 2018

Я бы переместил извлечение соответствующего QuerySet в дополнительный метод, который вы можете переопределить для повторного использования как можно большей части исходного кода:

class ProductList(View):

    def get_products(self):
        return Product.objects.all()

    def get(self, request, *args, **kwargs):
        products = self.get_products()
        # ... 

class ProductList(View):

    def get_products(self):
        qs = super().get_products()
        qs = qs.filter(user=self.request.user)
        return qs

    # no get needed

Эта самая функциональность поставляется с ListView Джанго и его get_queryset методом.

0 голосов
/ 05 сентября 2018

Если вы извлекаете набор запросов для данного запроса, используя метод get_queryset, который использует CBV, такой как DetailView, то вы можете просто переопределить get_queryset родительского класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...