【问题标题】:Django display data for current user onlyDjango 仅显示当前用户的数据
【发布时间】:2018-06-17 00:09:22
【问题描述】:

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

我不确定我的 models.py 设置是否不正确(是否每个模型都需要与用户相关的外键?)或者在 views.py 文件中是否有解决方案(我试过这个使用 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 %}

【问题讨论】:

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


    【解决方案1】:

    关键问题似乎出在

        def get_queryset(self):
            return Performance.objects.all()
    

    部分。

    您将获得视图中的所有 Performance 对象(从代码的objects.all() 部分可以看到)。

    您必须以某种方式过滤用户的性能。您可以在视图中使用self.request.user 获取当前用户。

    问题是,查看您的模型,用户似乎使用相关的相关模型(性能 -> 广告帐户 -> 帐户),这使您想要的操作有点复杂。只要这是您打算创建的模型结构,它就可以进入您的数据库架构。

    假设你不会改变架构,这就是简单的英语必须发生的事情:

    使用 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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2020-04-05
      • 2019-09-25
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多