簡體   English   中英

將多個Django應用程序合並到一個視圖中,我在做什么錯?

[英]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,則該視圖將正常運行。 這里發生了什么?

我嘗試過的事情:

  • 從url_list.html刪除擴展和塊定義不起作用。
  • request傳遞給我的對象實例renderable ,我得到一個__init__ expects 1 argument, got 2錯誤
  • 在ResourceList上定義__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM