【问题标题】:How to add url parameters to Django template url tag?如何将 url 参数添加到 Django 模板 url 标签?
【发布时间】:2014-10-10 07:25:07
【问题描述】:

在我看来要获取这样的url参数:

date=request.GET.get('date','')

在我的 url 中,我尝试使用 url 模板标签以这种方式传递参数,如下所示:

<td><a href="{% url 'health:medication-record?date=01/01/2001' action='add' pk=entry.id %}" >Add To Log</a></td>

? 后面的参数显然不起作用,我怎样才能传递这个数据值以便用 get 检索?

【问题讨论】:

  • 查看link
  • 在考虑这个的时候,一定要区分“Django url参数”和“url查询参数”。 Django url 参数在urls.py 中使用path() 配置,例如path('client/&lt;int:id&gt;/')。 URL 查询参数是? 之后的 URL 部分,例如https://example.com/a/b/?param1=value1&amp;param2=value2。这个问题是关于url查询参数的,但是有些答案是参考django url参数的。
  • 请参阅this answer 以获取用于呈现 url 查询字符串的简单自定义模板标签。

标签: django django-templates


【解决方案1】:

首先,您需要准备好您的网址以接受正则表达式中的参数: (urls.py)

url(r'^panel/person/(?P<person_id>[0-9]+)$', 'apps.panel.views.person_form', name='panel_person_form'),

所以你在你的模板中使用这个:

{% url 'panel_person_form' person_id=item.id %}

如果您有多个参数,您可以使用以下方法更改您的正则表达式并修改模板:

{% url 'panel_person_form' person_id=item.id group_id=3 %}

【讨论】:

  • @MehranNouri 使用 request.GET 而不是 request.get
  • 无论如何通过从上下文传递字典来传递动态数量的kwargs?例如{% url target_link target_kwargs %} 相当于将 **kwargs 传递给函数。我有一个用例,其中target_link 是可变的,因此不知道 url 中的 kwarg 数
  • 请注意,这些不是查询参数,这个答案是描述 django url 参数。这不是 OP 所问的(答案确实描述了一个可行的替代解决方案)。
【解决方案2】:

我在这里找到了答案:Is it possible to pass query parameters via Django's {% url %} template tag?

只需将它们添加到末尾:

<a href="{% url myview %}?office=foobar">
For Django 1.5+

<a href="{% url 'myview' %}?office=foobar">

[没有其他需要改进的地方,但我在修复代码滴答时遇到了一个愚蠢的错误]

【讨论】:

  • 如果使用这个,用户可以在导航栏上看到“office=foobar”信息,不是吗?
  • 这不会导致尾部斜杠中断 url,比如 example.com/myview/?office=foobar 而不是 example.com/myview?office=foobar
  • 肖恩:是的。如果您不想要这个,请使用 POST 请求,或者找到一些反向通道方式来传递参数。在 URL 上传递参数是 GET 请求的标准
  • 什么传递两个参数?
【解决方案3】:

只需添加模板网址:

<a href="{% url 'service_data' d.id %}">
 ...XYZ
</a>

在 django 2.0 中使用

【讨论】:

  • @ScottSkiles 然后您应该将问题编辑为特定版本的 Django,然后添加另一个以涵盖更新的版本。有人会说这是重复,但我不同意。一个问题中有多个版本可能会产生误导。
【解决方案4】:

这可以通过三个简单的步骤完成:

1) 添加带有url标签的项目ID:

{% for item in post %}
<tr>
  <th>{{ item.id }}</th>
  <td>{{ item.title }}</td>
  <td>{{ item.body }}</td>
  <td>
    <a href={% url 'edit' id=item.id %}>Edit</a>
    <a href={% url 'delete' id=item.id %}>Delete</a>
  </td>
</tr>
{% endfor %}

2) 添加urls.py的路径:

path('edit/<int:id>', views.edit, name='edit')
path('delete/<int:id>', views.delete, name='delete')

3)views.py 上使用 id:

def delete(request, id):
    obj = post.objects.get(id=id)
    obj.delete()

    return redirect('dashboard')

【讨论】:

  • 输入您的代码而不是添加屏幕截图以避免投票失败。
  • 我在 Django 文档中寻找的确切内容。
  • 我认为您需要为您的 href 添加双引号。
【解决方案5】:

我不确定我是否超出了主题,但我找到了适合我的解决方案; 您有一个基于类的视图,并且希望将 get 参数作为模板标签:

class MyView(DetailView):
    model = MyModel

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['tag_name'] = self.request.GET.get('get_parameter_name', None)
        return ctx

然后你提出你的获取请求/mysite/urlname?get_parameter_name='stuff

在您的模板中,当您插入{{ tag_name }} 时,您将可以访问获取参数值('stuff')。如果你的模板中有一个url也需要这个参数,你可以这样做

 {% url 'my_url' %}?get_parameter_name={{ tag_name }}"

您不必修改您的 url 配置

【讨论】:

    【解决方案6】:

    1:HTML

               <tbody>
                {% for ticket in tickets %}
                  <tr>
                    <td class="ticket_id">{{ticket.id}}</td>
                    <td class="ticket_eam">{{ticket.eam}}</td>
                    <td class="ticket_subject">{{ticket.subject}}</td>
                    <td>{{ticket.zone}}</td>
                    <td>{{ticket.plaza}}</td>
                    <td>{{ticket.lane}}</td>
                    <td>{{ticket.uptime}}</td>
                    <td>{{ticket.downtime}}</td>
                    <td><a href="{% url 'ticket_details' ticket_id=ticket.id %}"><button data-toggle="modal" data-target="#modaldemo3" class="value-modal"><i class="icon ion-edit"></a></i></button> <button><i class="fa fa-eye-slash"></i></button>
                  </tr>
                {% endfor %}
                </tbody>
    

    {% url 'ticket_details' %} 是您视图中的函数名称

    2:Views.py

    def ticket_details(request, ticket_id):
    
       print(ticket_id)
       return render(request, ticket.html)
    

    ticket_id 是您将从 ticket_id=ticket.id 获得的参数

    3: URL.py

    urlpatterns = [
    path('ticket_details/?P<int:ticket_id>/', views.ticket_details, name="ticket_details") ]
    

    /?P - 其中ticket_id 是组名,pattern 是要匹配的模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 2011-01-08
      • 1970-01-01
      • 2021-02-11
      • 2021-06-05
      • 2017-08-11
      • 2020-05-02
      • 2014-08-06
      相关资源
      最近更新 更多