基于类的视图
class SaleListView(ListView):
model = Sale
template_name = 'webapp/sale.html'
context_object_name = 'sales'
事务模型 - 用户可以拥有许多事务
class Transaction(models.Model):
currency = models.CharField(max_length=20)
amount = models.IntegerField()
total_price = models.DecimalField(max_digits=7, decimal_places=2)
date_purchased = models.DateTimeField()
note = models.TextField(default="")
owner = models.ForeignKey(User, on_delete=models.CASCADE)
销售模式 - 交易可以有很多销售
class Sale(models.Model):
amount_sold = models.IntegerField()
total_price_sold = models.DecimalField(max_digits=7, decimal_places=2)
date_sold = models.DateTimeField(default=timezone.now)
note = models.TextField(default="")
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
您需要使用get_queryset
方法来更新查询集
class SaleListView(ListView):
model = Sale
template_name = 'webapp/sale.html'
context_object_name = 'sales'
def get_queryset(self, *args, **kwargs):
qs = self.model.objects.filter(transaction__owner=self.request.user)
return qs
我们可以过滤查询集,如:
from django.contrib.auth.mixins import LoginRequiredMixin
class SaleListView(LoginRequiredMixin, ListView):
model = Sale
template_name = 'webapp/sale.html'
context_object_name = 'sales'
def get_queryset(self):
return super().get_queryset().filter(transaction__owner=self.request.user)
我们在这里过滤查询集,这样我们只获得Sale
s,其中相关的transaction
有一个owner
,即self.request.user
:登录用户。
LoginRequiredMixin
非常有用,如果他/她未登录,则无法访问给定视图。在这种情况下,系统将返回重定向到登录页面(如果您指定,则返回另一页面)。