【问题标题】:How to use dynamic tabs in django?如何在 django 中使用动态选项卡?
【发布时间】:2020-07-19 07:41:51
【问题描述】:

我正在尝试在我的项目中实现动态选项卡,该选项卡根据存储在数据库中的值提供多个选项卡。 在我的例子中,我有两个值存储在数据库中,所以它只显示两个,如果我增加更多,它会相应地显示。

Category.objects.filter(category='MEDICINES')
Out[14]: <QuerySet [<Category: FRUITS>, <Category: GRAINS>]>

这是我的 models.py 文件,

from django.db import models
from django.contrib.auth.models import User


STATUS = ((0, "Draft"), (1, "Publish"))

class Category(models.Model):
    category_names = (
        ('DISEASES','DISEASES'),
        ('MEDICINES','MEDICINES'),
        ('ENCYCLOPEDIA','ENCYCLOPEDIA'),
        )
    category = models.CharField(max_length=100, choices=category_names)
    sub_category = models.CharField(max_length=100, unique=True)
    def __str__(self):
        return self.sub_category

class Medicine(models.Model):
    title = models.CharField(max_length=200, unique=True)
    display_name = models.CharField(max_length=17, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='medicine_posts')
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    updated_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)

    class Meta:
        ordering = ["-created_on"]

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        from django.urls import reverse

        return reverse("medicine_detail", kwargs={"slug": str(self.slug)})

这是我的views.py文件,

from django.views import generic
from .models import Medicine, Category
from django.shortcuts import render, get_object_or_404

class MedicineList(generic.ListView):
    queryset = {'medicine' : Medicine.objects.filter(status=1).order_by("-created_on"),
                'category' : Category.objects.all()
                }
    #queryset = Medicine.objects.filter(status=1).order_by("-created_on")
    print(queryset)
    template_name = "medicine.html"
    context_object_name = 'element'
    #paginate_by = 10

这是我的医学.html 文件,

<div class="container">
    <div class="row">
      <div class="col-md-8 mt-3 left">
        <nav>

          <div class="nav nav-tabs nav-fill" id="nav-tab" role="tablist">
            {% for item in element.category %}
            <a class="nav-item nav-link active" id="{{ item.id }}" data-toggle="tab" href="#{{ item }}" role="tab" aria-controls="nav-home" aria-selected="true">{{ item }}</a>

            {% endfor %}
          </div>

        </nav>
        {% for item in element.category %}
        <div class="tab-content py-3 px-3 px-sm-0" id="nav-tabContent">
          <div class="tab-pane fade show active" id="{{ item }}" role="tabpanel" aria-labelledby="{{ item.id}}">
            <table class="col-md-8 mt-3 left">
                {% for post in element.medicine %}
                    {% cycle 'row' '' as row silent %}
                    {% if row %}<tr>{% endif %}
                        <td style="padding: 10px;">
                           <div class="card mb-4">
                              <div class="card-body">
                                <h6 class="card-title text-center"><a href="{% url 'medicine_detail' post.slug  %}"> {{ post.display_name }}</a></h6>
                              </div>
                            </div>
                        </td>
                    {% if not row %}</tr>{% endif %}
                {% endfor %}
            </table>
          </div>
        </div>
      {% endfor %}
      </div>

      {% block sidebar %}
    {% include 'sidebar.html' %}
    {% endblock sidebar %}
    </div>
  </div>

请帮我解决这个代码,它不起作用。

【问题讨论】:

  • “如果我会增加更多,它会相应地显示” - 那么究竟是什么不起作用?
  • 当我单击选项卡时,它没有正确显示选项卡内的内容。 :(

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


【解决方案1】:

你的查询集不应该是一个字典,Django 在这里需要一个查询集实例。

试试:

class MedicineList(generic.ListView):
    queryset = Category.objects.all()
    # or: model = Category
    template_name = "medicine.html"
    context_object_name = 'element'

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-04-11
  • 2015-06-10
  • 1970-01-01
  • 2012-04-16
  • 2012-11-06
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多