Django仅显示当前用户的数据

时间:2018-01-08 01:04:48

标签: python django django-models django-templates django-views

我希望仅为当前用户显示效果模型的数据。现在,该页面显示所有性能数据,而不仅仅是登录用户的数据。

我不确定我是否错误地设置了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 %}

1 个答案:

答案 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)

这是一种方法,虽然不是最有效但易于可视化的方法。其他人可能会找到更好的方法 - 如果有任何问题,请告诉我!