Django 通过 URL 传递 kwargs

Mat*_*kes 0 django url django-templates django-views

这部分代码的目的是在类似于下面显示的模板中显示所有加入组的请求:

Request 1 | Add | Delete
Request 2 | Add | Delete
Request 3 | Add | Delete
....
Run Code Online (Sandbox Code Playgroud)

我想做的是将“添加”和“删除”按钮 href 设置为视图中的一个函数。但是我想知道将 **kwarg 从模板传递到视图的正确方法是什么。否则,是否有更好的方法来实现这一目标?

模板

{% for asking in requested %}
    <a href={% url 'group_judge_request' group_profile.slug decision=0 %}>Cut {{ asking.user.username }}</a>
    <a href={% url 'group_judge_request' group_profile.slug decision=1 %}>Keep {{ asking.user.username }}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

网址

url(r'^judge_request/(?P<gslug>[\w-]+)$',
    group_judge_request,
    kwargs={'decision':'decision'},
    name='group_judge_request'),
Run Code Online (Sandbox Code Playgroud)

查看 group_judge_restart

def group_judge_request(request, gslug, decision):
Run Code Online (Sandbox Code Playgroud)

查看 group_requested_invites

def group_requested_invites(request, gslug):
  ....
  requested = GroupRequestToJoin.objects.filter(group=group_profile.group, checked=False)
  return render(request, "groups/group_requested_invites.html", {
    'requested' : requested,
    })
Run Code Online (Sandbox Code Playgroud)

错误:

Don't mix *args and **kwargs in call to reverse()!
Run Code Online (Sandbox Code Playgroud)

Ern*_*mbe 5

我认为您想使用 url 查询。所以你的网址如下:

<a href="{% url 'group_judge_request' group_profile.slug %}?decision=0">Cut {{asking.user.username }}</a>
Run Code Online (Sandbox Code Playgroud)

然后,您可以继续使用以下方法列出查询:

request.META['QUERY_STRING']
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要非查询字符串的默认版本,我个人更喜欢 request.GET['decision'] 或 request.GET.get('decision', False) 。但这也取决于用例。 (2认同)

小智 5

我认为没有办法使用内置的 url 模板标签从模板中传递这样的 *kwargs。

有两种方法可以做到这一点,一种是创建两个单独的 url 并将决定作为 kwarg 传递给视图:

网址.py

url(r'^judge_request_cut/(?P<gslug>[\w-]+)$',
    group_judge_request,
    kwargs={'decision': 0},
    name='group_judge_request_cut'),
url(r'^judge_request_keep/(?P<gslug>[\w-]+)$',
    group_judge_request,
    kwargs={'decision': 1},
    name='group_judge_request_keep'),
Run Code Online (Sandbox Code Playgroud)

模板

{% for asking in requested %}
    <a href={% url 'group_judge_request_cut' group_profile.slug decision=0 %}>Cut {{ asking.user.username }}</a>
    <a href={% url 'group_judge_request_keep' group_profile.slug decision=1 %}>Keep {{ asking.user.username }}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

或者您可以将整数作为参数传递:

网址.py

url(r'^judge_request/(?P<gslug>[\w-]+)/(?P<decision>\d{1})$',
    group_judge_request,
    name='group_judge_request'),
Run Code Online (Sandbox Code Playgroud)

模板

{% for asking in requested %}
    <a href={% url 'group_judge_request' group_profile.slug 0 %}>Cut {{ asking.user.username }}</a>
    <a href={% url 'group_judge_request' group_profile.slug 1 %}>Keep {{ asking.user.username }}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 如果kwargs中已经定义了decision=[0|1],为什么还需要在url中传递decision=[0|1]呢? (2认同)