【问题标题】:How to Show Subcategory under Specific Category in Django?如何在 Django 中的特定类别下显示子类别?
【发布时间】:2019-12-02 08:03:29
【问题描述】:

我的代码有问题,相同的子类别显示在所有类别下,如果一个类别没有子类别,那么该类别也显示子类别,我想显示一个类别是否有子类别,那么它应该是显示在下拉列表中,否则应为空白。

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

class WebCategory(models.Model):
  name = models.CharField(max_length=50, unique=True, verbose_name='Category name')
  slug = models.SlugField(verbose_name='Slug')
  title = models.CharField(max_length=165, null=True)
  metadesc = models.TextField(max_length=165, null=True)
  created_at = models.DateTimeField(auto_now_add=True, null=True)
  updated_at = models.DateTimeField(auto_now=True)

  class Meta:
      verbose_name_plural = 'WebCategory'

  def save(self, *args, **kwargs):
    self.slug = slugify(self.name)
    super(WebCategory, self).save(*args, **kwargs)

 def __str__(self):
    return self.name

class WebSubCategory(models.Model):
  category = models.ForeignKey('WebCategory', related_name='subcategory', on_delete=models.CASCADE, blank=True,
                             null=True, verbose_name='Select category')
  name = models.CharField(max_length=50)
  slug = models.SlugField(unique=True, null=True)
  title = models.CharField(max_length=100, null=True)
  metadesc = models.TextField(max_length=165, null=True)
  description = RichTextField(blank=True, null=True)
  created_at = models.DateTimeField(auto_now_add=True, null=True)
  updated_at = models.DateTimeField(auto_now=True)

  class Meta:
      verbose_name_plural = 'WebSubCategory'

  def __str__(self):
      return self.name

这是我的views.py文件

def home(request):                                                                  
  context = RequestContext(request)                                               
  category_list = WebCategory.objects.order_by('-created_at')[:5]                 
  subcategory_list = WebSubCategory.objects.order_by('-created_at')[:5]           
  context_dict = {'webcat': category_list, 'websubcat':subcategory_list}          
  return render_to_response('home.html', context_dict, context)                   

这是我的 header.html 文件..

 <ul class="nav nav-pills" id="mainNav">
     {%if webcat %}
     {% for category in webcat %}
        <li class="dropdown dropdown-mega">
            <a class="dropdown-item dropdown-toggle" href="JavaScript:void()">
                {{category}}
            </a>
            <ul class="dropdown-menu">
                {% if websubcat %}
                <li>
                    <div class="dropdown-mega-content">
                        <div class="row">
                            {% for subcategory in websubcat.all %}
                            <div class="col-lg-3">
                                <span class="dropdown-mega-sub-title">Elements 1</span>
                                <ul class="dropdown-mega-sub-nav">
                                    <li><a class="dropdown-item" href="{{subcategory.slug}}">{{subcategory.name}}</a></li>
                                </ul>
                            </div>
                            {% endfor %}
                        </div>
                    </div>
                </li>
                {% else %}
                <p>No category Found</p>
                {% endif %}
            </ul>
        </li>
    {% endfor %}
 {% else %}
<p>No Category Found</p>
{% endif %}

请指导我如何在类别下显示特定的子类别(如果一个类别有子类别),现在我正在获得所有类别下的子类别。

【问题讨论】:

  • 您的视图功能似乎在这里被“切断”了(在每行一定数量的字符之后)。
  • 现在改变视图功能
  • 你能告诉我 WebCategory 和 WebSubCategory 模型吗?看起来您没有在关系之后的模板中运行 for 循环。
  • 我已经更新了我的模型,请检查一次..

标签: django django-models django-rest-framework django-templates django-views


【解决方案1】:

它向您显示相同的内容,因为那是您要求它做的事情;你总是迭代同一个集合。

您应该遵循模板中的关系,而不是从视图中发送 WebSubCategory。你没有展示模型,所以我不知道字段名称是什么,但是例如:

{% for subcategory in category.subcategory.all|slice:":5" %}
<div class="col-lg-3">
    <span class="dropdown-mega-sub-title">Elements 1</span>
    <ul class="dropdown-mega-sub-nav">
        <li><a class="dropdown-item" href="{{subcategory.slug}}">{{subcategory.name}}</a></li>
    </ul>
</div>
{% endfor %}

另外请注意,您不应该在视图中使用 RequestContext 和 render_to_response;请改用render 快捷方式。

def home(request):                                                                  
  category_list = WebCategory.objects.order_by('-created_at')[:5]                 
  context_dict = {'webcat': category_list}
  return render(request ,'home.html', context_dict)

【讨论】:

  • 已更新;尽管请注意 subcategory 不是一个好的相关名称,因为它实际上与 多个 子类别有关。
  • 那么我应该如何更改subcategory relaed_name,你能写出完整的查询...
  • 好吧,我向您展示的内容会起作用,我只是在提出风格观点;如果你坚持设置它(我不推荐)你应该使用subcategories
  • 你的意思是它应该是这样的 related_name='subcategories'
  • 我已经用你的答案更新了我的代码,但仍然显示没有找到类别错误。
猜你喜欢
  • 2019-12-02
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多