背景:我正在通过使用Django 1.11处理一个简单的待办事项列表应用程序来学习Django。该应用程序具有“组”和“项目”,其中项目是单独的待办事项,每个项目只属于一个组。这些网址最终可能会起到以下作用:
# snippet from urls.py
url(r'^groups$', views.all_groups, name="all_groups"),
url(r'^groups/(\d+)/$', views.view_group, name="view_group"),
url(r'^items$', views.all_items, name="all_items"),
url(r'^items/(\d+)/$', views.view_item, name="view_item"),
上述每个页面都会显示一个或两个列表(例如,所有项目,或特定组中的所有项目等),其中每个表格元素都是指向页面的链接以显示特定组或特定项目。
我对上述每个网址都有一个单独的视图,但我能够使用单个HTML模板成功呈现每个表格。根据网址,网址标记有0或1个参数:{%url'my_url'%}或{%url'my_url'arg1%}
以下是HTML模板的一个片段,它可以使用任意数量的行和列呈现表,但最多有两个url标记的参数:
# lists.html - works for several different views
# every table entry is a dictionary with an 'page_ref' key and a 'display_text' key
<table>
{% for row in url_table %}
<tr>
{% for col in row %}
{% if col.arg2 %}
<td><a href="{% url col.page_ref col.arg1 col.arg2 %}">{{col.display_text}}</a></td>
{% elif col.arg1 %}
<td><a href="{% url col.page_ref col.arg1 %}">{{col.display_text}}</a></td>
{% else %}
<td><a href="{% url col.page_ref %}">{{col.display_text}}</a></td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
我的问题:
1)我在HTML模板中的代码处理{%url'my_url'%}与{%url'my_url'arg1%}与{%url'my_url'arg1 arg2%}有效,但它很丑陋且有限最多2个级别的URL。这可能对我想要的很好,但我不喜欢这些代码。是否有更简洁的方法来处理任意数量的参数?当我尝试在不需要的情况下根本不传递arg1 / arg2时,我得到了一个关于无法反转''(或类似的错误消息)的例外。
2)一般来说,制作这样的通用模板是一个坏主意吗?即,更好的做法是每个视图都有一个特定的HTML模板,而不是更通用吗?我的猜测是否定的,但我想我会问。
我也可以提供视图代码,但我不认为我的问题需要它。
由于
答案 0 :(得分:0)
由于您有不同的观点,但您使用的是同一模板
所以你可以做的是 从模板中移除条件 和 从包含不同绝对网址的每个视图中发送相同的上下文变量名称 。
# view1 no arguments
class AllGroupView(TemplateView):
template_name = 'path/to/your.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['my_url'] = reverse('all_groups')
return context
#view2 one argument
class GroupView(TemplateView):
template_name = 'path/to/your.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['my_url'] = reverse('view_group', args=[arg1])
return context
...
#view3 two argument
class ItemView(TemplateView):
template_name = 'path/to/your.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['my_url'] = reverse('view_item', args=[arg1, arg2])
return context
在html中只使用此变量
# use my_url absolute: http://localhost:8000/...
<td><a href="{{ my_url }}">{{display_text}}</a></td>