我希望仅为当前用户显示效果模型的数据。现在,该页面显示所有性能数据,而不仅仅是登录用户的数据。
我不确定我是否错误地设置了models.py(每个模型是否需要有一个与用户相关的外键?)或者在views.py文件中是否有解决方案(I尝试使用get_context_data,但无法使其工作)
非常感谢任何帮助!
models.py
class Adaccount(models.Model):
accountname = models.CharField(max_length=250)
def __str__(self):
return self.accountname
class Performance(models.Model):
adaccount = models.ForeignKey(Adaccount, on_delete=models.CASCADE)
date = models.DateField(auto_now_add=True)
campaign = models.CharField(max_length=500)
adset = models.CharField(max_length=500)
clicks = models.IntegerField()
impressions = models.IntegerField()
ctr = models.FloatField()
cpc = models.FloatField()
cpm = models.FloatField()
conv1 = models.IntegerField()
conv2 = models.IntegerField(blank=True, null=True)
conv3 = models.IntegerField(blank=True, null=True)
def __str__(self):
return str(self.date) + ' - ' + str(self.adaccount)
class Account(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
adaccounts = models.ForeignKey(Adaccount,null=True)
company = models.CharField(max_length=250, blank=True)
website = models.CharField(max_length=30, blank=True)
def __str__(self):
return self.company
views.py
class IndexView(LoginRequiredMixin, generic.ListView):
model = Performance
context_object_name = 'all_performance'
template_name = 'dashboard/index.html'
login_url = '/login/'
redirect_field_name = 'redirect_to'
def get_queryset(self):
return Performance.objects.all()
class HomeView(TemplateView):
model = Adaccount
template_name = 'dashboard/home.html'
HTML模板
<strong>CTR | CPC | CPM</strong><br>
{% for daily in all_performance %}
<span>{{ daily.ctr }} | {{ daily.cpc }} | {{ daily.cpm }}</span><br>
{% endfor %}
答案 0 :(得分:0)
关键问题似乎与
有关 def get_queryset(self):
return Performance.objects.all()
一部分。
您正在视图中获取所有Performance对象(正如您从objects.all()
部分代码中看到的那样)。
您必须以某种方式过滤用户的效果。您可以在视图中使用self.request.user
获取当前用户。
问题是,查看您的模型,用户似乎处于相关的相关模型(性能 - &gt; Adaccount - &gt;帐户),这使您想要的操作有点复杂。只要这是您要创建的模型结构,它就可以进入数据库的体系结构。
假设你不会改变架构,那么普通英语就是这样:
使用request.user过滤所有帐户。从这些帐户中获取所有Adaccounts。从Adaccounts中过滤所有演奏组。
def get_queryset(self):
user = self.request.user
adaccount_list = Account.objects.filter(user=user)\
.values_list('adaccounts', flat=True)
return Performance.objects.filter(adaccount__in=adaccount_list)
这是一种方法,虽然不是最有效但易于可视化的方法。其他人可能会找到更好的方法 - 如果有任何问题,请告诉我!