【问题标题】:I want to display a list of categories on my HTML page from a Django 2.2 model but having trouble我想在我的 HTML 页面上显示来自 Django 2.2 模型的类别列表,但遇到了问题
【发布时间】:2020-03-24 04:25:18
【问题描述】:

我正在使用 Django 创建一个电子商务网站,在产品页面上我有一个带有类别选择的侧边栏。我会根据产品模型中给出的类别选择来动态显示类别选择。

这是HTML的图片(请不要判断内容或商店类型;-):

这是玩具产品的模型:

class ToyProduct(models.Model):

    slug = models.SlugField(max_length=40)
    image = models.ImageField(upload_to='media')
    title = models.CharField(max_length=150)
    description = models.TextField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    stock_quantity = models.PositiveIntegerField()
    in_stock = models.BooleanField(default=True)
    category = models.CharField(choices=TOY_CATEGORY_CHOICES, 
    max_length=2, default='FW')
    brand = models.CharField(choices=TOY_BRAND_CHOICES, max_length=2, 
    default='NB')
    on_sale = models.BooleanField(default=False)

    def __str__(self):
        return self.title

以下是在 models.py 文件的元组中定义的类别选择:

TOY_CATEGORY_CHOICES = (
    ('FW', 'For Women'),
    ('FM', 'For Men'),
    ('DD', 'Dildo'),
    ('VB', 'Vibrator'),
    ('LX', 'Luxury'),
    ('KT', 'Kit'),
    ('BP', 'Butt Plug'),
    ('PM', 'Prostate Massager'),
    ('AB', 'Anal Bead')
)

这是views.py中的视图

def products_sextoys_view(request):

    context = {
        'header': 'Sex Toys',
        'toy': ToyProduct.objects.all()
    }

    return render(request, 'products/sextoys.html', context)

这是目前为止的 HTML 文件:

<section id="products-framework">
    <div class="container mt-5 mb-5">
        <div class="row">
            <div class="col-2" id="category-column">
                <h1 class="text-center">Category Choices</h1>
                <h4><strong>Category</strong></h4>

                <a href="#"><h3></h3></a>


                <hr class="newhr">

                <h4><strong>Brands</strong></h4>

                <a href="#"><h3></h3></a>

                <hr class="newhr">
            </div>

如您所见,我尝试了一个 for 循环,但这并没有输出任何内容。我尝试了几件事,以及输入 for 循环和引用 ToyProducts 类中的选择对象的各种方法,但似乎没有任何效果。模型中有数百个带有侧边栏和各种选择的页面,因此对每个页面都进行硬编码不是我想做的。我希望能够遍历 catrgory 选项并将它们显示为左侧的列表

非常感谢!

【问题讨论】:

  • 请始终尝试使用格式化代码而不是屏幕截图。如果人们可以复制和修改代码,而不是从头开始编写,那么他们会更容易提供帮助。

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


【解决方案1】:

编辑: 现在我们可以看到视图代码了。 ToyProduct.objects.all() 是一个查询集,它没有属性category,所以当你尝试访问toy.category 时,你什么也得不到。即使正确完成,循环通过玩具获取类别也会导致问题。最好的计划肯定是确保类别列表在模板上下文中可用。

我无法更具体或更明确,因为您没有显示视图代码,但是:toy.category 很可能是对分配给ToyProduct 的任何实例的类别的引用模板上下文为toy。循环遍历您想让TOY_CATEGORY_CHOICES 可用于模板的所有类别。

【讨论】:

  • 真的很抱歉,我以为我有,我已经在上面添加了,谢谢
  • 我已经更新了我的答案来解决这个问题。将来它可能会帮助您了解复制和粘贴代码块比发布图像更受欢迎 - 它使人们在回答时更容易复制和编辑您的代码,并且更易于访问/阅读。
  • 注意,感谢您的宝贵时间!我会确保从这里复制和粘贴
【解决方案2】:

所以我认为可以避免创建多个类别列表,但显然不是,我创建了一个字典类别,并作为值创建了一个列表,其中包含每个类别选项作为字符串。然后我在 HTML 中遍历了这个字符串:

def products_sextoys_view(request):

    context = {
        'header': 'Sex Toys',
        'toy': ToyProduct.objects.all(),
        'categories': [
            'For Women',
            'For Men',
            'Dildos',
            'Vibrators',
            'Luxury',
            'Kits',
            'Butt Plugs',
            'Prostate Massagers',
            'Anal Beads'
        ]
    }

    return render(request, 'products/sextoys.html', context)

这是 HTML:

<div class="col-2" id="category-column">
                <h1 class="text-center">Category Choices</h1>
                <h4><strong>Category</strong></h4>

                {% for category in categories %}
                <a href="#"><h3>{{ category }}</h3></a>
                {% endfor %}

                <hr class="newhr">

                <h4><strong>Brands</strong></h4>

                <a href="#"><h3></h3></a>

                <hr class="newhr">
            </div>

我也会重复品牌选项的过程,谢谢大家!

【讨论】:

  • 最好为类别创建一个单独的模型,然后在您的产品模型中添加一个ManyToManyField。这样,如果您稍后有一个新类别,您所要做的就是创建一个新对象。否则,您将不得不为这些琐碎的添加修改代码。
  • 你能解释一下许多字段以及它们是如何使用的吗?我看过它们并尝试理解它们但还没有完全理解,可能是因为我还没有发现对它们的需要还没有。
猜你喜欢
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多