使用 Listview class django 2 在模板中获取对象详细信息
reach object detail in template using Listview class django 2
我正在学习教程,我想在我的模板 html 文件中显示每个对象 属性(保存在数据库中),如下所示:
{% for obj in objects_list %}
<p>{{ obj.name }} => {{ obj.location }} <b>timecreated</b>==> {{ obj.timestamp }} <b>time updated</b>==> {{ obj.updated }}</p>
{% endfor %}
我应该在 url 和这个 url
http://localhost:8000/restaurants/shomal/
/shomal/
是我们的 slug,我们必须观察类别等于 = shomal
的对象细节
我在模板中看不到循环结果,但在打印查询集中时,我可以在终端中看到对象详细信息
为什么我无法在循环模板中获取对象详细信息?
在我的应用程序视图文件中,我有
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.views import View
from django.views.generic import TemplateView, ListView
from .models import Restaurant
from django.db.models import Q
def restaurants_listview(request,):
template_name = 'restaurants/restaurants_list.html'
query_set = Restaurant.objects.all()
context = {
"objects_list": query_set
}
return render(request, template_name, context)
class RestaurantListView(ListView):
template_name = 'restaurants/restaurants_list.html'
def get_queryset(self):
print(self.kwargs)
slug = self.kwargs.get("slug")
if slug:
queryset = Restaurant.objects.filter(
Q(category__iexact=slug)|
Q(category__icontains=slug)
)
print(queryset)
# return queryset
else:
queryset = Restaurant.objects.all()
return queryset
在 django url.py 文件中我有
from django.contrib import admin
from django.urls import path
from django.views.generic.base import TemplateView
from restaurants.views import (
restaurants_listview,
RestaurantListView
)
urlpatterns = [
path('admin/', admin.site.urls),
path('', TemplateView.as_view(template_name="home.html")),
path('restaurants/', RestaurantListView.as_view()),
path('restaurants/<str:slug>/', RestaurantListView.as_view()),
path('about/', TemplateView.as_view(template_name="about.html")),
path('contact/', TemplateView.as_view(template_name="contact.html")),
]
这是我的模型文件
from django.db import models
# Create your models here.
class Restaurant(models.Model):
name = models.CharField(max_length=120)
location = models.CharField(max_length=120, null=True, blank=True)
category = models.CharField(max_length=120, null=True, blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
默认情况下,ListView
将对象列表作为 object_list
添加到模板上下文中。您目前有 objects_list
.
最简单的解决方法是将模板更改为使用 object_list
:
{% for obj in object_list %}
<p>{{ obj.name }}</p>
{% endfor %}
由于您的模型是Restaurant
,您也可以使用restaurant_list
,这将使您的模板更具描述性:
{% for restaurant in restaurant_list %}
<p>{{ restaurant.name }}</p>
{% endfor %}
如果您不想使用object_list
或restaurant_list
,另一种选择是设置context_object_name
。
我正在学习教程,我想在我的模板 html 文件中显示每个对象 属性(保存在数据库中),如下所示:
{% for obj in objects_list %}
<p>{{ obj.name }} => {{ obj.location }} <b>timecreated</b>==> {{ obj.timestamp }} <b>time updated</b>==> {{ obj.updated }}</p>
{% endfor %}
我应该在 url 和这个 url
http://localhost:8000/restaurants/shomal/
/shomal/
是我们的 slug,我们必须观察类别等于 = shomal
我在模板中看不到循环结果,但在打印查询集中时,我可以在终端中看到对象详细信息
为什么我无法在循环模板中获取对象详细信息?
在我的应用程序视图文件中,我有
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.views import View
from django.views.generic import TemplateView, ListView
from .models import Restaurant
from django.db.models import Q
def restaurants_listview(request,):
template_name = 'restaurants/restaurants_list.html'
query_set = Restaurant.objects.all()
context = {
"objects_list": query_set
}
return render(request, template_name, context)
class RestaurantListView(ListView):
template_name = 'restaurants/restaurants_list.html'
def get_queryset(self):
print(self.kwargs)
slug = self.kwargs.get("slug")
if slug:
queryset = Restaurant.objects.filter(
Q(category__iexact=slug)|
Q(category__icontains=slug)
)
print(queryset)
# return queryset
else:
queryset = Restaurant.objects.all()
return queryset
在 django url.py 文件中我有
from django.contrib import admin
from django.urls import path
from django.views.generic.base import TemplateView
from restaurants.views import (
restaurants_listview,
RestaurantListView
)
urlpatterns = [
path('admin/', admin.site.urls),
path('', TemplateView.as_view(template_name="home.html")),
path('restaurants/', RestaurantListView.as_view()),
path('restaurants/<str:slug>/', RestaurantListView.as_view()),
path('about/', TemplateView.as_view(template_name="about.html")),
path('contact/', TemplateView.as_view(template_name="contact.html")),
]
这是我的模型文件
from django.db import models
# Create your models here.
class Restaurant(models.Model):
name = models.CharField(max_length=120)
location = models.CharField(max_length=120, null=True, blank=True)
category = models.CharField(max_length=120, null=True, blank=True)
timestamp = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
默认情况下,ListView
将对象列表作为 object_list
添加到模板上下文中。您目前有 objects_list
.
最简单的解决方法是将模板更改为使用 object_list
:
{% for obj in object_list %}
<p>{{ obj.name }}</p>
{% endfor %}
由于您的模型是Restaurant
,您也可以使用restaurant_list
,这将使您的模板更具描述性:
{% for restaurant in restaurant_list %}
<p>{{ restaurant.name }}</p>
{% endfor %}
如果您不想使用object_list
或restaurant_list
,另一种选择是设置context_object_name
。