Как использовать динамические c вкладки в django? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь реализовать динамические c вкладки в моем проекте, которые дают несколько вкладок на основе значений, хранящихся в базе данных. В моем случае у меня есть два значения, хранящихся в базе данных, поэтому он отображает только два. Если я увеличу еще больше, он будет отображаться соответственно.

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>

Пожалуйста, помогите мне с этим кодом, это; не работает.

1 Ответ

0 голосов
/ 07 апреля 2020

Ваш набор запросов не должен быть словарем, Django ожидает здесь экземпляр набора запросов.

Попробуйте:

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