【发布时间】:2013-06-15 05:41:25
【问题描述】:
我是 django 新手,我想知道从模板中包含视图(具有特定逻辑及其生成的 HTML)的最佳/推荐方法是什么。
我的具体例子如下: 我有一个模型:
class City(models.Model):
name = models.CharField(max_length=200)
class Place(models.Model):
city = models.ForeignKey(City)
name = models.CharField(max_length=200)
state = models.IntegerField()
所以我需要一个视图来显示每个城市及其地点。每个地方都应该根据其状态以不同的方式呈现。每种不同的方式都非常不同,可能需要相当多的业务逻辑。
根据我对其他框架的经验,我设想如下。从城市模板调用将呈现位置的视图,该视图将具有所有必要的逻辑,并会选择使用哪个模板来呈现位置: 示例伪代码:
城市.html
{% for place in places %}
{% include_view 'show_place' place %}
{% endfor %}
include_view 标签将调用视图的位置,该视图将决定给定位置使用哪个模板:
def show_place(request, place):
# Here I will probably use more logic to prepare the template.
template_name = "places/default.html"
if place.state == 1 :
template_name = 'places/active.html'
if place.state == 2 :
template_name = 'places/started.html'
if place.state == 3 :
template_name = 'places/completed.html'
# etc
return render(request, template_name, { 'place': place } )
这种方法在 django 中可行吗?
我已经看到了使用包含标签的可能性,例如:Include a view in a template 或 Template includes and django views/urls. How (do/should) they work?
但这会强制使用固定模板注册自定义模板函数: register.inclusion_tag('results.html')(show_results) #这里我需要逻辑,并让'results.html'动态化。
我还希望将 show_place 作为普通视图,以便能够直接访问它。
我也可以执行 IF 来询问模板内的状态并使用 {% include %} 标记,但这将允许我在视图中的其他方法中拥有额外的业务逻辑:
{% for place in places %}
{% if place.state = 1 %}
{% include 'places/active.html' %}
{% if ... }
{% include ... }
{% endfor %}
最好的方法是什么?
谢谢!
【问题讨论】:
标签: django python-2.7 django-templates django-views