在Django中,url标记是否可以包含任意数量的参数?

时间:2017-12-14 02:51:15

标签: python django django-templates

背景:我正在通过使用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模板,而不是更通用吗?我的猜测是否定的,但我想我会问。

我也可以提供视图代码,但我不认为我的问题需要它。

由于

1 个答案:

答案 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>