在django模板中使用多个块和视图

时间:2018-04-03 07:20:09

标签: html django django-templates block

我是django的新用户,我发现您可以创建templates来填充views。 你也可以创建一些每个人都扩展的basic.htm ......

假设我有两页:(django demo)

  • 所有问题清单
  • 问题详情。

现在我想创建“一页”,第一个视图为侧边栏,另一个视图为“细节右侧”视图。

我希望点击侧边栏中的列表更改右侧。

如果我可以使用不同的视图(在views.py中)来加载单独的模板,那就太好了。

我希望基本的html会是这样的:

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Makro Zadravec</title>
    {% load staticfiles %}
    <link rel="stylesheet" type="text/css" href="{% static 'demo/css/bootstrap.min.css.css' %}" />
</head>
<body class="body" style="background-color: #f6f6f6">
    <div>
        <h1> This is title</h1>
    </div>
    <div>
        {% block sidebar %}

        {% endblock %}
    </div>
    <div>
        {% block content %}
        {% endblock %}
    </div>
</body>
</html> 

然后我会有块的模板:

  • content
  • 边栏

在不同的视图中。

2 个答案:

答案 0 :(得分:1)

除了造型之外,还有你可以遵循的逻辑

正如你所说,你已经有了已加载问题列表的模板,那么你的基本视图会将所有问题对象作为查询集返回。

首先,您不需要编写单独的模板,因为您可以处理此

{% block content %}
   // this will load list of all question
{% endblock %}
{% block detail %}
   // here display detail of question
{% endblock %}

创建两个网址,一个没有kwargs,另一个没有kwargs(如果你使用django版本&lt; 2.0,你需要使用url而不是path

path('target/', QuestionView.as_view(), name='target-list'),
path('target/<int:pk>', QuestionView.as_view(), name='target-detail')

现在在视图文件中你只需要处理kwargs:

class QuestionView(TemplateView):
     template_name = "template.html"
     model = Question

     def get_context_data(self, **kwargs):
        context = super(QuestionView, self).get_context_data(**kwargs)
        context['question_list'] = #your queryset to list question#
        pk = kwargs.get('pk', None)  # this will return pk (id of question) if hit url otherwise None
        if pk:
            context['question_detail'] = #your queryset to get question-detial# 
        return context

所以,如果你用kwargs点击url,它会返回问题列表和详细信息,并将其作为模板中的上下文,您可以按如下方式访问:

{% block content %}
    # access question_list to list out all question
{% endblock %}

{% block detial %}
    {% if question_detail %}  // if question_detail context passed from view
        # add detail of question by accessing question_detail
    {% endif %}
{% endblock %}

答案 1 :(得分:0)

您可以根据一个视图执行此操作。

创建名为&#39; question&#39;的变量在您的视图中,在开始时将其定义为空字符串。然后,如果有人点击侧边栏上的某个问题,您可以使用带有问题ID的参数创建网址以显示详细信息(&#39; / page /?question = 1&#39;)或者您可以将此ID存储在会话中,就像您一样想。并再次调用相同的视图。然后在视图中检查您是否在网址中获取参数或者它是否存储在会话中,如果它是真的,您将问题对象(通过id获得)分配给变量&#39;问题&#39; 。将此变量发送到模板。在模板中,您始终会渲染侧边栏,并检查变量是否有问题&#39;不等于空字符串然后您呈现问题的详细信息。

这样的事情:

{% block sidebar %}
...
{% endblock %}
{% if question != '' %}
{% block content %}
...
{% enblock %}
{% endif %}