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

Use multiple block and views in django templates

我是 django 的新手,我看到您可以创建可以填充到 views 中的 templates。 您还可以创建一些 basic.htm 每个人都可以扩展...

假设我有两个页面:(django 演示)

现在我想创建 "one page",第一个视图作为侧边栏,另一个视图作为 "detail- right" 视图。

我希望通过单击侧边栏中的列表更改右侧视图。

如果我可以使用不同的视图(在 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> 

然后我会有块模板:

在单独的视图中。

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

在您的视图中创建名为 'question' 的变量,该变量在开始时定义为空字符串。然后,如果有人单击侧边栏块上的某个问题,您可以使用带有问题 ID 的参数制作 url 以显示详细信息('/page/?question=1'),或者您可以根据需要将此 ID 存储在会话中.并再次调用相同的视图。然后在视图中检查是否在 url 中获取参数或者它是否存储在会话中,如果是,则将问题对象(通过 id 获取)分配给变量 'question'。将此变量发送到模板。在模板中,您始终呈现侧边栏并检查变量 'question' 是否不等于空字符串,然后呈现问题的详细信息。

像这样:

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

除了此处的样式之外,您还可以遵循以下逻辑

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

首先,你不需要编写单独的模板,因为你可以处理这个

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

创建两个 urls 来击中一个没有 kwargs 和另一个有 kwargs (如果你使用 django 版本 < 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,它将 return 问题列表和详细信息作为模板中的上下文,您可以按以下方式访问:

{% 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 %}