所以,让我们说我有一个名为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
类?
答案 0 :(得分:0)
当然可以。您可以创建一个类,如下所示:
class CardsCustomView(View):
...
class CardView(CardsCustomView):
def get(self, request, *args, **kwargs):
...
由于CardView
从CardCustomView
延伸而且此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)