首页 > 解决方案 > 如何从Django中的另一个视图继承

问题描述

我正在尝试制作一个简单的网站,用户可以在其中订购食物。所以我有很多方法的视图 - 'pizza_sizes' 只是其中之一:

class PizzaOrderView(TemplateView):
    template_name = 'pizza/pizza_order.html'
    pizza_type = ProductType.objects.filter(name='Regular Pizza').values_list('id', flat=True)[0]

    def post(self, request):
        to_return = add_to_cart(request)
        return to_return

    def pizza_sizes(self):
        sizes = Product.objects.filter(type=self.pizza_type).values_list('size__name', flat=True).distinct()
        return sizes

我还有一个 ListView 显示用户在购物车中的所有产品。

class CartView(ListView):
    template_name = 'orders/cart.html'

从此页面用户可以删除或更新产品。所以我使用 UpdateView 让他更新它,但我又需要所有这些方法(我在 PizzaOrderView 中使用的)。我可以将这些方法重写为这个视图,但这并没有多大意义,我试图像这样继承它:

class ProductUpdateView(UpdateView, PizzaOrderView):
    model = CartItem
    fields = '__all__'
    pizza_type = list(ProductType.objects.filter(name__contains='Pizza').values_list('id', flat=True))

    def post(self, request, **kwargs):
        cart_id = self.kwargs.get('pk')
        to_return = update_user_cart(request, cart_id)
        return to_return

    def get_template_names(self):
        product_type = CartItem.objects.filter(id=self.kwargs.get('pk')).values_list('product__type', flat=True)[0]
        if product_type in self.pizza_type:
            self.template_name_suffix = '_pizza_update'
        else:
            self.template_name_suffix = '_form'
        return super().get_template_names()

然后在我的模板中使用它,但是它会抛出一个 AttributeError:

“ProductUpdateView”对象没有属性“对象”

Traceback:

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\views\generic\base.py" in dispatch
  97.         return handler(request, *args, **kwargs)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\views\generic\base.py" in get
  158.         context = self.get_context_data(**kwargs)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\views\generic\edit.py" in get_context_data
  67.         return super().get_context_data(**kwargs)

File "C:\Users\jakub.sygowski\Documents\django\CS50\project3\venv\lib\site-packages\django\views\generic\detail.py" in get_context_data
  94.         if self.object:

Exception Type: AttributeError at /update/47 Exception Value: 'ProductUpdateView' object has no attribute 'object'

好像它以某种方式从 ListView 中丢失了它的“对象”属性。

我在这里想念什么?什么是正确的方法?

标签: pythondjangodjango-views

解决方案


推荐阅读