在 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 %}
我是 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 %}