[英]How to display a queryset object name rather than a queryset object itself in Django?
[英]How to display name of table from queryset in django
試圖獲取 django 中的表名,我需要它通過 if state.net 正確顯示詳細視圖。 我有這樣的觀點要展示
class Home(ListView):
template_name = 'home.html'
def get_queryset(self):
qs1 = Book.objects.all()
qs2 = CD.objects.all()
qs3 = Film.objects.all()
queryset = sorted(list(chain(qs1, qs2, qs3)), key=operator.attrgetter('title'))
return queryset
它返回給我這個
[<CD: Music1>, <CD: Music2>, <Book: 一些書>]
如何在此模板中獲取“CD”或“Book”
{% block content %}
<div class="row">
{% for object in object_list %}
<div class="col-md-3">
<div class="card card-product-grid">
<img src="{{ object.image.url }}">
<a href="{% url 'DetailBook' object.pk %}" class="title">{{ object.title }}</a>
</div>
</div>
{% endfor %}
</div>
{% endblock content %}
同時,如果顯示 detailview 和 listview 是個壞主意,而且它的做法不同,請告訴我,我將不勝感激
我嘗試了不同的方式來循環顯示 object.key,但效果不是很好。 和其他查詢集查詢。
我一直在list(chain(ob1, ob2, .. obn)
路線下。從代碼可維護性和復雜性的角度來看,它證明非常乏味。Django 多態是通往 go 的方式。
from polymorphic.models import PolymorphicModel
class Product(PolymorphicModel):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='products')
title = models.CharField(max_length=100)
slug = ...
... more fields all products share ex: price
def __str__(self):
return str(self.title)
@property
def model_name(self):
return self._meta.model_name
class Cd(Product):
<model fields for CD model>
class Book(Product):
<model fields for book model>
class Film(Product):
<model fields for film model>
然后:
Product.objects.all()
將返回所有 CD、Book 和 Film 對象的實例。
在您的模板中,您可以使用屬性model_name
來檢查 object 是否是某種類型的 model。
{% block content %}
<div class="row">
{% for object in object_list %}
{% if object.model_name == 'book' %}
<div class="col-md-3">
<div class="card card-product-grid">
<img src="{{ object.image.url }}">
<a href="{% url 'DetailBook' object.pk %}" class="title">{{ object.title }}</a>
</div>
</div>
{% endif %}
{% endfor %}
</div>
{% endblock content %}
您可以使用 model 選項的.verbose_name
屬性[Django-doc]獲得它,所以my_object._meta.verbose_name
。 然而這里有一個問題:您不能訪問以下划線開頭的變量,因為這些變量是“受保護的”或“私有的”。
一種解決方案可能是使用模板過濾器。 您可以定義一個templatetags
目錄:
app_name/ __init__.py models.py templatetags/ __init__.py model_utils.py views.py
您在其中以粗體字創建文件。 在model_utils
中,您可以構造一個過濾器:
from django import template
register = template.Library()
@register.filter
def modelname(value):
return value._meta.verbose_name
然后我們可以在模板中使用這些:
{% load model_utils %}
{% for object in object_list %}
…
{{ object|modelname }}
{% endfor %}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.