I'm new to django. And now I'm studying using the class-based generic views. Could someone plea开发者_运维技巧se explain the aim and use of context_object_name attribute?
If you do not provide "context_object_name", your view may look like this:
<ul>
{% for publisher in object_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
But if you provide like {"context_object_name": "publisher_list"}, then you can write view like:
<ul>
{% for publisher in publisher_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
That means you can change the original parameter name(object_list) into any name through "context_object_name" for your view. Hope that help:)
Ok, I've got it by myself! :)
It's just a human-understandable name of variable to access from templates
https://docs.djangoproject.com/en/1.10/topics/class-based-views/generic-display/#making-friendly-template-contexts
Lets assume the following 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'
On the first line we’re importing ListView and in the second line we need to explicitly define which model we’re using. In the view, we subclass ListView, specify our model name and specify our template reference. Internally ListView returns an object called object_list that we want to display in our template.
In our templates file home.html we can use the Django Templating Language’s for loop to list all the objects in object_list
Why object_list? This is the name of the variable that ListView returns to us.
Lets look at our templates/home.html
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in object_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
You see the object_list above? It is not a very friendly name? To make it more user-friendly, we can provide instead an explicit name using context_object_name.
This helps anyone else reading the code to understand what is variable in the template context, plus it is much easier to read and understand.
So let's go back to our posts/views.py and change it by adding the one line below:
context_object_name = 'all_posts_list' # <----- new
So our new views.py looks like this now:
# 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
And let's not forget to update our template now:
<!-- templates/home.html -->
<h1>Message board homepage</h1>
<ul>
{% for post in all_posts_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
You could have left as object_list and it would still work, but you get the idea.
Consider these 2 code snippet
A. Using function based view:
def index(request):
product_list = Product.objects.all()
return render(request, 'product/index.html', {'product_list': **product_list**})
B. Using class based view
class ProductListView(ListView):
model = Product
template_name = 'product/index.html'
context_object_name = 'product_list'
In both the above method your context variable will be "product_list", and your HTML will be,
{% 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 %}
精彩评论