Django使用ViewView的最佳方式

时间:2015-10-23 19:16:09

标签: python django django-class-based-views

所以,让我们说我有一个名为Card的模型:

models.py

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

现在让我说我有一个观点:

views.py

class CardView(View):
    def get(self, request, *args, **kwargs):
         cards = Card.objects.filter(user=request.user)
         return render(request, 'index.html', {'cards': cards})

我的问题如下:我如何重构CardView以便我可以将Card过滤抽象为可以继承的超类?在ListView中我知道我可以创建另一个继承自object的类,覆盖get_context_data,然后像这样调用它:class CardListView(CardObjectsMixin, ListView),但是可以用它来做同样的事情通用View类?

2 个答案:

答案 0 :(得分:0)

当然可以。您可以创建一个类,如下所示:

class CardsCustomView(View):
    ...

class CardView(CardsCustomView):

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

由于CardViewCardCustomView延伸而且此View延伸至CardView。在View中,您可以访问任何CardCustomView的属性或方法(listed here)以及您在class CardCustomView(View): state = 'started' # just an example def get_user_cards(self): return Card.objects.filter(user=self.request.user) 中创建的任何属性或方法。我们来看这个例子:

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()类没有 if ($fileError == UPLOAD_ERR_OK) { $tmp_name = $_FILES['file']['tmp_name']; $name = $_FILES['file']['name']; move_uploaded_file($tmp_name, "$your_uploads_dir/$name"); } 方法,您可以在我上面提供的链接中看到。

答案 1 :(得分:0)

ListViews 已经包含此功能。您所要做的就是覆盖get_queryset以返回用户过滤的qs;然后你的所有观点都可以继承。

另请注意,您几乎不应该覆盖get本身;总有一种更好的方法可以使用,就像这里一样。

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