[英]Combining multiple django apps into one view, what am I doing wrong?
我有一個包含多個應用程序的Django項目,需要將它們組合並呈現為一個頁面。 我有以下幾節代碼:
我嘗試與其他視圖聚合的視圖之一:
class ResourceList(generic.View):
model = Submissions
template_name = 'url_list.html'
def get(self, request, *args, **kwargs):
resources = Submissions.objects.all()
return render_to_string(self.template_name, {'object_list': resources})
我試圖用來聚合我的應用程序的視圖:
class Index(View):
def get(self, request, *args, **kwars):
renderable = {
'content': ResourceList(),
'login': LoginView() # I don't care about the LoginView at the moment.
}
return render(request, 'index.html', renderable)
url_list.html
{% extends "base.html" %} <!--I've removed this, it did nothing -->
{% block content }
{{ object.url}}
<ul>
{% for resource in object_list %}
<li> {{resource.url}} {{ resource.id }} {{ resource.rating }}</li>
{% endfor %}
</ul>
{% endblock %}
index.html
<head>
<title>HI</title>
</head>
<body>
{% block login %} login {% endblock %} {% block content %} content {% endblock %}
</body>
</html>
問題是當我轉到為頁面設置的測試URL時,它僅呈現“登錄內容”。 如果我將render_to_string
更改為render_to_response
並轉到設置為渲染的URL,則該視圖將正常運行。 這里發生了什么?
我嘗試過的事情:
request
傳遞給我的對象實例renderable
,我得到一個__init__ expects 1 argument, got 2
錯誤 __init__
以接受request
參數。 它只是呈現占位符內容。 您不能那樣做。 視圖是美化的功能。 它們具有單個入口點( dispatch()
),該入口點由Django內部調用,並根據HTTP方法(此處為get()
)自行調用正確的方法。 將視圖強制轉換為字符串只會顯示其名稱,而不是調用它。
如果要聚合多個視圖的行為,則有幾種選擇。
例如:
from django.views.generic.base import ContextMixin
class ResourceListMixin(ContextMixin):
def get_resource_list(self):
# we put it in a separate method to allow easy overriding
return Submissions.objects.all()
def get_context_data(self, **kwargs):
kwargs['resources'] = self.get_resource_list()
return super(ResourceListMixin, self).get_context_data(**kwargs)
現在,您可以將其混合到任何視圖中,它將自動了解{{ resources }}
。 例如:
from django.views.generic.base import TemplateView
class IndexView(ResourceListMixin, TemplateView):
template_name = 'index.html'
# nothing else here, we leverage the power of Django's
# TemplateView - it will do everything by itself
然后, IndexView
視圖將呈現index.html
模板,並且將能夠執行{% for resource in resources %}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.