【问题标题】:Not able to access data using 'categories.products .all ' in template view. Django Models with foreign key无法在模板视图中使用“categories.products .all”访问数据。带有外键的 Django 模型
【发布时间】:2019-11-10 07:31:57
【问题描述】:

我的模型使用外键建立关系。

class Cat1(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length = 100)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=50)
    productId = models.AutoField(max_length=50,primary_key=True)
    productType = models.CharField(max_length=50)
    matType = models.CharField(max_length=100,default='Use comma , to seperate multiple materials') 
    seller = models.ForeignKey(User, related_name='sellers',on_delete=models.CASCADE,default='NA')
    cat_1 = models.ForeignKey(Cat1,related_name='catlevel1',on_delete=models.CASCADE,default='NA')

然后我有我对页面的看法。 我需要在其中显示我单击的类别中的所有产品。 我的观点是:

def cat_products(request,pk):
   categories = get_object_or_404(Cat1, pk=pk) #here the categories get the category i clicked on homepage.
   products = Product.objects.all()
   return render(request, 'products.html', {'categories':categories,'products':products})

那么products.html就是:

<!--Full Code not shown for easy understanding-->
{% for prod in categories.products.all %}

       {{categories.name}} 
        <tr>
          <td>{{ prod.name }}</td>
          <td>{{ prod.matType }}</td>
          <td>0</td>
          <td>0</td>
          <td>0</td>
        </tr>
      {% endfor %}

所以基本上类别是可以用来访问当前类别的名称。产品是所有产品的列表。

我已经尝试过上面的代码,但没有产生任何结果。 现在下面的代码显示了所有产品对象。

<!--Full Code not shown for easy understanding-->
{% for prod in products %}

       {{categories.name}} 
        <tr>
          <td>{{ prod.name }}</td>
          <td>{{ prod.matType }}</td>
          <td>0</td>
          <td>0</td>
          <td>0</td>
        </tr>
      {% endfor %}

但这种方式会显示所有产品,而不考虑类别。 所以这件男士类别的派对衬衫也出现在女士身上。

我尝试只打印所有产品 {% for prod in products %} {{categories.name}} 上面的代码行显示了类的名称。 这很好用,没有问题。

后端能够访问数据库没问题,但我无法弄清楚模板部分 这是产品对象中存储为 Men 的产品和类别。

我应该能够在男性类别中看到男性类别产品,在女性类别中看到女性产品。

【问题讨论】:

    标签: python django templates view


    【解决方案1】:

    您需要使用catlevel1 而不是产品:

    {% for prod in categories.catlevel1.all %}
    
       {{categories.name}} 
        <tr>
          <td>{{ prod.name }}</td>
          <td>{{ prod.matType }}</td>
          <td>0</td>
          <td>0</td>
          <td>0</td>
        </tr>
      {% endfor %}
    

    因为您在创建ProductCat1 之间的ForeignKey 关系时已将related_name 定义为catlevel1

    【讨论】:

    • 非常感谢!!从早上开始,我一直在努力解决这个问题。最后我可以继续了。我不知道是这种情况以及如何使用相关名称。我是 Django 新手。
    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 2019-06-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-01-31
    • 2020-02-02
    相关资源
    最近更新 更多