我是django的新手。现在我正在学习使用基于类的通用视图。 有人可以解释 context_object_name 属性的目的和用途吗?
答案 0 :(得分:43)
如果您不提供“context_object_name”,您的视图可能如下所示:
<ul>
{% for publisher in object_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
但如果您提供类似{“context_object_name”:“publisher_list”},那么您可以编写如下视图:
<ul>
{% for publisher in publisher_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
这意味着您可以通过视图的“context_object_name”将原始参数名称(object_list)更改为任何名称。 希望有所帮助:)
答案 1 :(得分:18)
好的,我自己搞定了! :)
从模板
访问它只是一个人类可理解的变量名称答案 2 :(得分:4)
让我们假设以下posts / views.py:
# posts/views.py
from django.views.generic import ListView from .models import Post
class HomePageView(ListView):
model = Post
template_name = 'home.html'
在第一行中,我们要导入ListView,在第二行中,我们需要明确定义我们正在使用的模型。在视图中,我们子类化ListView,指定模型名称并指定模板引用。在内部,ListView返回一个名为 object_list 的对象,该对象要显示在模板中。
在模板文件home.html中,我们可以使用Django模板语言的for循环列出 object_list
中的所有对象为什么选择object_list??这是ListView返回给我们的变量的名称。
让我们看看我们的template / home.html
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in object_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
您看到上面的object_list吗?这不是一个很友好的名字吗? 为了使其更易于使用,我们可以改用 context_object_name 提供一个明确的名称。
这可以帮助其他阅读代码的人理解模板上下文中的变量,并且更容易阅读和理解。
因此,我们返回到posts / views.py并通过添加以下一行来对其进行更改:
context_object_name = 'all_posts_list' # <----- new
所以我们的新views.py现在看起来像这样:
# posts/views.py
from django.views.generic import ListView from .models import Post
class HomePageView(ListView): model = Post
template_name = 'home.html'
context_object_name = 'all_posts_list' # <----- new
让我们不要忘记立即更新模板:
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in all_posts_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
您本可以保留为object_list,但仍然可以使用,但是您明白了。
答案 3 :(得分:0)
考虑这两个代码段
A。使用基于函数的视图:
def index(request):
product_list = Product.objects.all()
return render(request, 'product/index.html', {'product_list': **product_list**})
B。使用基于类的视图
class ProductListView(ListView):
model = Product
template_name = 'product/index.html'
context_object_name = 'product_list'
在上述两种方法中,您的上下文变量都将为“ product_list”,而您的HTML将为
{% for product in product_list %}
<div class="row">
<div class="col-md-3 offset-md-2">
<img src="{{product.product_image}}" class="card" height="150px" />
</div>
<div class="col-md-4">
<h3>{{product.product_name}}</h3>
.......
</div>
<div class="col-md-2">
.........
</div>
</div>
{% endfor %}