如何在Django模板url标签中添加URL参数?

173

在我看来,获取URL参数的方法如下:

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

我正在尝试使用url模板标签以这种方式传递参数:

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

问号后的参数显然不起作用,我该如何传递这个数据值以便使用get方法检索?


1
请查看此链接:https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#url。 - Nagkumar Arkalgud
可能是通过Django的{% url %}模板标签传递查询参数是否可行?的重复问题。 - Ciro Santilli OurBigBook.com
4
在思考这个问题时,请确保区分“Django URL参数”和“URL查询参数”。 Django URL参数是在“urls.py”中使用“path()”进行配置的,例如path('client/<int:id>/')。 URL查询参数是在“?”之后的URL的一部分,例如 https://example.com/a/b/?param1=value1&param2=value2。这个问题涉及到URL查询参数,但有些答案涉及Django URL参数。 - Christian Long
请参考此答案,了解一个简单的自定义模板标签,用于呈现URL查询字符串。 - Christian Long
6个回答

246

首先,您需要准备好您的URL以接受正则表达式中的参数:(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。 - Cyd
1
有没有办法通过从上下文中传递字典来传递动态数量的kwargs?例如 {% url target_link target_kwargs %} 这将相当于向函数传递 **kwargs。我有一个用例,其中 target_link 是变量,因此在URL中kwargs的数量是未知的。 - teebagz
16
请注意,这些不是查询参数,这个回答描述的是Django URL参数。这不是原帖所问的内容(尽管该回答确实描述了一个可行的替代解决方案)。 - BjornW

156

1
如果使用这个,用户在导航栏上会看到“office=foobar”的信息,对吗? - Diansheng
1
这样做会导致尾随斜杠打断URL,例如example.com/myview/?office=foobar而不是example.com/myview?office=foobar - Al Sweigart
3
Sean说:是的。如果你不想这样做,使用POST请求或找到一些背渠道来传递参数。在URL上传递参数是GET请求的标准做法。 - Shayne
1
传递两个参数是什么意思? - FightWithCode

41

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

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')

输入代码而不是添加屏幕截图,以避免下降评价。 - Vaibhav Vishal
Django文档中正是我正在寻找的东西。 - Igor Voltaic
我认为你需要为你的href添加双引号。 - Behrouz Beheshti

39

只需添加模板网址:

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

适用于Django 2.0版本


@ScottSkiles,您应该将问题编辑为特定版本的Django,然后再添加另一个问题来覆盖更新的版本。有些人会说这是重复的,但我不同意。在一个问题中涉及多个版本可能会导致误导。 - Bernardo Duarte

15

我不确定是否离开了主题,但我找到了适合我的解决方案;你有一个基于类的视图,并且你想要将一个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

然后您发出您的GET请求/mysite/urlname?get_parameter_name='stuff

在您的模板中,当您插入{{ tag_name }}时,您将可以访问获取参数值('stuff')。如果您的模板中还有需要此参数的URL,则可以执行以下操作

 {% url 'my_url' %}?get_parameter_name={{ tag_name }}"
您不必修改您的URL配置。

9

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是用于匹配的某个模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接