【问题标题】:How can I display a tuple field from a model to a template in Django?如何在 Django 中显示从模型到模板的元组字段?
【发布时间】:2021-04-23 10:04:02
【问题描述】:

我对这里的 Django 很陌生,所以请放轻松...

让我详细说明标题问题的含义。基本上我有这个模型....


    class Meta:
        verbose_name_plural = 'Digital Media'

    CATEGORY_CHOICES = (
        ('icon_sets', 'Icon Sets'),
        ('brand_logos', 'Brand Logos'),
        ('web_banners', 'Web Banners')
    )
    name = models.CharField(max_length=20, choices=CATEGORY_CHOICES)

    SIZE_CHOICES = (
        ('1616', '16 x 16 pixels'),
        ('3232', '32 x 32 pixels'),
        ('6464', '64 x 64 pixels'),
        ('128128', '128 x 128 pixels'),
        ('256256', '256 x 256 pixels')
    )
    sizes = models.CharField(max_length=20, choices=SIZE_CHOICES)

    def __str__(self):
        return self.name

还有这个观点……


def product_detail(request, product_id):
    """ A view to show individual product details """

    print_media = Print_Media.objects.all()
    digital_media = Digital_Media.objects.all()

    product = get_object_or_404(Product, pk=product_id)

    print(product, print_media, digital_media)
    context = {
        'product': product,
        'print_media': print_media,
        'digital_media': digital_media,
    }
    return render(request, 'products/product_detail.html', context)

所以“如果”上面的代码一切正常,有人可以帮我将模型中的字段“大小”放到模板上,因为我自己无法做到这一点 - 这是我尝试过的到目前为止...

{% with product.is_print_media as p %}
    {% if p %}
        <div class="col-12">
            {{ p.sizes }}
            <p><strong>Size:</strong></p>
            <select class="form-control rounded-0 w-50" name="product_size" id="id_product_size">
                <option value="{{ p.sizes }}"></option>
                <option value=""></option>
                <option value="" selected></option>
                <option value=""></option>
                <option value=""></option>
            </select>
        </div>
    {% endif %}
{% endwith %}

非常感谢任何帮助:)

再次 - 对新手放轻松.....

【问题讨论】:

  • 你想展示什么? sizes 字段的值还是要遍历 SIZE_CHOICES?对&lt;option&gt; &lt;/option&gt;感到困惑

标签: python django tuples field


【解决方案1】:

在 django 模板中,选项会像这样显示。这将返回该字段的可读值,

{{ p.get_sizes_display }}。

投票,如果这个对你有帮助!!!

【讨论】:

  • 谢谢@sree - 我试过 {{ p.size_choices }} 但什么也没发生 - 我做错了什么?
  • 我确实尝试过投票,但我还没有声望点,因为我只是新手...soz!
  • 不是 {{ p.size_choices }} ,而是 {{ p.get_sizes_display }}。更改选择以显示..
【解决方案2】:

如果 SIZE_CHOICES 是模型Print_Media 的属性,您可以在模板中访问我们的 p.SIZE_CHOICES

否则,在您的视图中将其提供为context Digital_Media.SIZE_CHOICES

def product_detail(request, product_id):
    """ A view to show individual product details """

    print_media = Print_Media.objects.all()
    digital_media = Digital_Media.objects.all()

    product = get_object_or_404(Product, pk=product_id)

    print(product, print_media, digital_media)
    context = {
        'product': product,
        'print_media': print_media,
        'digital_media': digital_media,
        'category_choices': Digital_Media.CATEGORY_CHOICES
        'size_choices': Digital_Media.SIZE_CHOICES
    }
    return render(request, 'products/product_detail.html', context)

在模板size_choicesp.SIZE_CHOICES 中。 假设你使用了size_choices

{% with product.is_print_media as p %}
    {% if p %}
        <div class="col-12">
            {{ p.sizes }}
            <p><strong>Size:</strong></p>
            <section class="mt-20">
                <select class="form-control rounded-0 w-50" name="product_size" id="id_product_size_{{ p.pk }}">
                {% for size in size_choices %}
                <option value="{{ item.0 }}" {% if size.0 == p.sizes %}selected{% endif %}>{{ item.1 }}</option>
                {% endfor %}
            </select>
        </div>
    {% endif %}
{% endwith %}

【讨论】:

  • 我如何将该信息获取到模板中?
  • @JinxCat,我编辑了我的答案:{% for size in size_choices %} {% endfor %}
  • @JinxCat,如果 SIZE_CHOICES 是模型 Print_Media 的属性,您可以在模板中访问我们 p.SIZE_CHOICES
【解决方案3】:

对于每个设置了选项的字段,对象将有一个 get_FOO_display() 方法,其中 FOO 是字段的名称。此方法返回字段的“人类可读”值。 所以试试:

{{p.get_sizes_display}}

再举一个例子:

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=2, choices=SHIRT_SIZES)

我们可以使用 (p as a Person) 在模板中访问 Small、Medium 和 Large:

{{p.get_shirt_size_display}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2019-09-17
    • 1970-01-01
    • 2019-05-29
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多