如何将网址参数添加到Django模板网址标签?


101

在我看来,要获取如下网址参数:

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

在我的网址中,我尝试通过这种方式通过网址模板标记传递参数,如下所示:

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

?之后的参数 显然不起作用,如何传递此数据值以便通过get进行检索?


检查此链接
Nagkumar Arkalgud


1
考虑这一点时,请确保区分“ Django url parameters”和“ url query parameters”。Django url参数是urls.py使用path()eg 配置的path('client/<int:id>/')。URL查询参数是?eg 之后的url部分https://example.com/a/b/?param1=value1&param2=value2。这个问题是关于url查询参数的,但是一些答案是关于Django url参数的。
克里斯蒂安·朗

请参阅此答案以获取用于呈现url查询字符串的简单自定义模板标记。
克里斯蒂安·朗

Answers:


171

首先,您需要准备您的网址以接受正则表达式中的参数:(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
无论如何,通过从上下文传递字典来传递动态数量的kwarg?例如{% url target_link target_kwargs %},这就像传递**kwargs给函数一样。我有一个用例,其中target_link变量是可变的,因此不知道网址中的
kwarg

请注意,这些不是查询参数,此答案描述的是django url参数。这不是OP所要的(答案确实描述了一种可行的替代解决方案)。
BjornW

94

我在这里找到了答案: 是否可以通过Django的{%url%}模板标记传递查询参数?

只需将它们添加到末尾即可:

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

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

[没有其他可改进的地方,但是在修复代码滴答时出现了一个愚蠢的错误]


1
如果使用此选项,则信息“ office = foobar”将在导航栏上对用户可见,不是吗?
滇盛

1
难道这不是结果结尾的斜线中断网址,例如example.com/myview/?office=foobar代替example.com/myview?office=foobar
Al Sweigart '17

3
肖恩:是的。如果您不希望这样做,请使用POST请求,或找到一些反向通道传递参数。在URL上传递参数是GET请求的标准
Shayne

什么传递两个论点?
FightWithCode '19

27

只需添加模板URL:

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

在Django 2.0中使用


@ScottSkiles然后,您应该将问题编辑到特定版本的Django,然后添加另一个问题以涵盖最新版本。有人会说这是重复的,但我不同意。一个问题中的多个版本可能会产生误导。
贝尔纳多·杜阿尔特

17

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

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文档中寻找的东西。
伊戈尔·伏打

10

我不确定自己是否超出主题范围,但是我找到了解决方案。您有一个基于类的视图,并且想要将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 }},您将可以访问get参数值(“ stuff”)。如果模板中的网址也需要此参数,则可以执行以下操作

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

您无需修改​​网址配置


5

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是组的名称,模式是要匹配的某种模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.