【问题标题】:Django foreign key value from template来自模板的 Django 外键值
【发布时间】:2020-09-02 00:57:25
【问题描述】:

我查看了类似问题的其他答案,但我似乎无法让它发挥作用。这是我的模型结构:

models.py

class Seller(models.Model):
    seller_full_name = models.CharField(max_length=50)
    seller_listing_name = models.CharField(max_length=50) <-- I want to display this in template
    email = models.EmailField(max_length=50)
    date_added = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.seller_listing_name

# Create your models here.
class Product(models.Model):
    ...
    seller = models.ForeignKey(Seller, on_delete=models.CASCADE, null=True, blank=True)
    ...

    def __str__(self):
        return self.product_name

在我看来,我得到了一组产品查询

views.py

def store(request):
    products = Product.objects.values().order_by('?') # shuffle order
    args = {'products': products}
    return render(request, 'store/products-page.html', args)

在模板中,我遍历产品并构建显示项目详细信息的卡片。我还想在每张卡片上显示每个产品的卖家列表名称。我似乎无法在视图中获得正确的外键语句,因为它在卖家姓名应为的位置呈现为空。

products-page.html

{% for product in products %}
<div class="col-lg-3 col-md-6 mb-4">
    ...
        <p>
            // {{ product.seller.seller_listing_name }} // <-- display sellers name here
        </p> 
        <h4 class="card-title">
            <a href="#">{{ product.product_name }}</a>
        </h4>
        <p>#{{ product.product_id }}</p>
        <p>{{ product.description }}</p>
        <h5>${{ product.price | floatformat:2 }}</h5>
    ...
</div>
{% endfor %}

我已经搞砸了一段时间,我似乎无法得到它,所以任何帮助都会很棒!

编辑 我看过的一些链接:

Django: How to get data connected by ForeignKey via Template?

Django foreign key relation in template

How to access foreign key table's data in Django templates?

解决方案 感谢下面的 cmets,我没有意识到我正在使用 .order_by('?') 将产品转换为字典 - 这导致数据结构无法保持我的关系,因此我无法访问我的外援。

views.py

def store(request):
    products = Product.objects.order_by('?') # REMOVE .values()
    args = {'products': products}
    return render(request, 'store/products-page.html', args)

products-page.html

{% for product in products %}
<div class="col-lg-3 col-md-6 mb-4">
    ...
        <p>
            // {{ product.seller.seller_listing_name }} // <-- display sellers name here
        </p> 
        <h4 class="card-title">
            <a href="#">{{ product.product_name }}</a>
        </h4>
        <p>#{{ product.product_id }}</p>
        <p>{{ product.description }}</p>
        <h5>${{ product.price | floatformat:2 }}</h5>
    ...
</div>
{% endfor %}

【问题讨论】:

    标签: python django django-models django-templates foreign-keys


    【解决方案1】:

    如果是 ForeignKey,您需要添加类似

    的内容
    {% for product in products %}
    <div class="col-lg-3 col-md-6 mb-4">
        [...]
            {% for seller in product.seller_set.all %}
            <p>
                // {{ seller.seller_listing_name }} // <-- display sellers name here
            </p> 
            {% endfor %}
            <h4 class="card-title">
                <a href="#">{{ product.product_name }}</a>
            </h4>
        [...]
    

    【讨论】:

    • 我已经尝试过了,它永远不会进入 for 循环,因此 p-tag 永远不会呈现。我又试了一次,同样的事情发生了。
    • 当黄色调试屏幕出现时,我可以看到包含产品查询集的本地变量。因为它具有“seller_id”,并正确引用了我想要的卖家名称。也许有一种方法可以使用我必须的 ID 以另一种方式获取名称?
    • 顺便说一句,为什么您在视图中使用products = Product.objects.values().order_by('?')?您从 Product 模型创建 dict?
    • 是的,我希望每次视图呈现时产品的顺序都会随机排列。我没有意识到这可能与它有关,因为没有其他任何东西受到影响,但现在我认为它可能是......我可以尝试删除它,看看是否有帮助
    • 试试Product.objects.order_by('?')
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 2011-11-04
    • 2017-06-14
    • 2016-09-14
    • 2011-04-27
    • 2015-10-17
    • 2016-05-05
    相关资源
    最近更新 更多