Как использовать один шаблон Django для разных целей - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть разные модели django , которые идентичны, например,

  • ItemCategory
  • InventoryCategory
  • MenuCategory
  • ExpenseCategory

Все эти модели имеют одинаковые атрибуты.

Я хочу использовать одну html-страницу , которая category_list.html , для отображения этих моделей в виде списка. Я не хочу использовать разные страницы, такие как item_category_list.html , ventroy_category_list.html , menu_category_list.html и так далее. Каждая страница содержит заголовок страницы , который является фактическим видом заголовка страницы, представленным в теге h1 . Я хочу изменить по отношению к загруженной в настоящее время странице.

Примечание: Я использую Универсальные представления для перечисления элементов, и в настоящее время я использую контекст для определения того, какое представление отправляет ответ.

Буду признателен за любую помощь.

views.py

class ItemCategoryList(ListView):
    model = ItemCategory
    template_name = 'app/category_list.html'

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        # Add in a QuerySet of all the books
        context['page'] = 'Item'
        return context


class InventoryCategoryList(ListView):
    model = InventoryCategory
    template_name = 'app/category_list.html'


class ExpenseCategoryList(ListView):
    model = ExpenseCategory
    template_name = 'app/category_list.html'

models.py

class ItemCategory(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=300, null=True, blank=True)
    image = models.ImageField(upload_to="uploads/item_categories/", null=True, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)


class InventoryCategory(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=300, null=True, blank=True)
    image = models.ImageField(upload_to="uploads/inventory_categories/", null=True, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

class ExpenseCategory(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=300, null=True, blank=True)
    image = models.ImageField(upload_to="uploads/expense_categories/", null=True, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

1 Ответ

0 голосов
/ 01 сентября 2018

Не на основе класса, но мое решение для этого просто будет:

models.py:

class Category(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=300, null=True, blank=True)
    image = models.ImageField(upload_to="uploads/categories/", null=True, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

urls.py:

url(r'^(?P<category>\w+)/$', views.ItemCategoryList, name='category')

home.html:

<a href="{% url 'category' 'ItemCategory' %}">Item Category</a>
<a href="{% url 'category' 'InventoryCategory' %}">Inventory Category</a>

category_list.html:

{% block title %}{{category.name}}{% endblock %}

{% for l in list %}
    {{l}}
{% endfor%}

views.py:

def ItemCategoryList(request, category):
    list = Category.objects.filter(name=category)
    category = category
    context{
      'list':list,
      'category':category
           }
    return render(request, 'app/category_list.html',context)
...