Django使用ListVi视图的最佳方式

2024-04-29 08:16:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个名为Card的模型:

在模型.py在

class Card(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=10, blank=True)

现在让我们假设我有一个观点:

在视图.py在

^{pr2}$

我的问题如下:如何重构CardView,以便将卡片过滤抽象为可继承的超类?在ListView中,我知道我可以创建另一个继承自object的类,重写get_context_data,然后像这样调用它:class CardListView(CardObjectsMixin, ListView),但是否可以对泛型View执行相同的操作?在


Tags: py模型modeltitlemodelscardlengthmax
2条回答

ListViews已经包含了这个功能。您所要做的就是重写get_queryset以返回按用户筛选的qs;然后您的所有视图都可以继承它。在

还要注意,您几乎不应该重写get本身;总有更好的方法可以使用,如这里所示。在

class MyBaseView(object):
    def get_queryset(self):
        return super(MyBaseView, self).get_queryset().filter(user=self.request.user)

当然可以。可以按如下方式创建类:

class CardsCustomView(View):
    ...

class CardView(CardsCustomView):

    def get(self, request, *args, **kwargs):
        ...

因为CardViewCardCustomView扩展而这一个从{}扩展。在CardView中,您可以访问View的任何属性或方法(listed here),以及您在CardCustomView中创建的任何属性或方法。举个例子:

^{pr2}$

然后您可以:

class CardView(CardCustomView):

    def get(self, request, *args, **kwargs):
        self.state ...  # This has 'started' value from parent class.
        self.current_user_cards = self.get_user_cards()  # This should have the cards for the current user

关于您的评论,基本View类没有.get_context_data()方法,正如您在上面提供的链接中看到的那样。在

相关问题 更多 >