【问题标题】:How to get products according to User in Django?如何根据 Django 中的用户获取产品?
【发布时间】:2020-10-21 04:44:10
【问题描述】:

我有CustomerProducts之间的关系,customer_id保存在Product模型表中,但我想根据customer在我的视图页面上显示产品,假设如果客户登录使用他的详细信息,然后他只能看到他的产品,但目前他可以看到所有产品。请告诉我我该怎么做。

这是我的models.py 文件...

class Customer(models.Model):
    name=models.CharField(default=None)
    user=models.OneToOneField(User, related_name='userwithCustomer', on_delete=models.CASCADE)

class Product(models.Model):
    name=models.CharField(default=None)
    customer=models.Foreignkey(Customer, related_name='customer_product', on_delete=models.CASCADE)

这是我的views.py 文件...

def display_data(request):
    test_display = Product.objects.all()
    context = {
        'test_display': test_display
    }
    return render(request, 'page.html', context)

这是我的page.html 文件...这里我正在尝试根据登录的客户显示产品..

<p>{{test_display.count}}</p>

【问题讨论】:

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


    【解决方案1】:

    如果您确定您的用户已登录(即会话已通过身份验证),您可以将查询集从 test_display = Product.objects.all() 更改为 test_display = Product.objects.filter(customer=request.user)。如果你想在你的视图上有登录约束,你可以在你的视图上使用 login_required 装饰器:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def display_data(request):
        test_display = Product.objects.filter(customer=request.user)
        context = {
            'test_display': test_display
        }
        return render(request, 'page.html', context)
    

    【讨论】:

    • 其实我想统计product表中这个客户的产品总数
    • @Amit 使用 Product.objects.filter(customer=request.user).len()
    • 嗯,这是一个基于客户的过滤查询集......它都与您的要求有关......例如迭代或计数......就像 &lt;p&gt;{{test_display.count}}&lt;/p&gt; 用于计算您的结果。
    • 它显示'QuerySet' object has no attribute 'len',如果我使用这个Product.objects.filter(customer=request.user.id).len()
    • 我在上一条评论中提到过...您应该使用Product.objects.filter(customer_id=request.user.id).count() 之类的东西来计算结果。
    【解决方案2】:

    问题是您使用的是产品而不是客户,因此将显示所有产品而不是所述用户单独拥有的产品。替换这行代码:

    Product.objects.all()
    

    与:

    request.user.customer_product.all()
    

    它应该只显示登录用户的项目。对于显示,您必须创建一个 for 循环来显示每个项目的详细信息,如下所示:

    <ul>
    {% for test in test_display %}
    <li>{{test.name}}:${{test.price}}</li>
    {% endfor %}
    </ul>
    

    【讨论】:

      猜你喜欢
      • 2020-06-26
      • 2013-09-07
      • 2023-03-05
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多