Django - 按钮网址

Posted

技术标签:

【中文标题】Django - 按钮网址【英文标题】:Django - button url 【发布时间】:2018-06-08 20:12:45 【问题描述】:

我有一个奇怪的问题。我正在创建一个将朋友添加到列表的功能,这是我的视图和网址。

@login_required(login_url='user:login')
def friend_add(request, friend):

    friendship = FriendShip(
        from_friend=request.user,
        to_friend=friend
    )

    friendship.save()
    return HttpResponseRedirect(request.path)

url(r'^add_friend/$', views.friend_add, name="add_friend"),

当我调用模板中的url时:

<input type="button" class="btn btn-info" value="Add Friend" onclick="location.href='% url 'user:add_friend' friend=post.poster %';">

加载网页时会发生异常:

找不到关键字参数“'friend': ”的“add_friend”。尝试了 1 种模式:['users/add_friend/$']

经过多次尝试,网页可以在删除输入的情况下加载

<input type="button" class="btn btn-info" value="Add Friend" onclick="location.href='% url 'user:add_friend'%';">

(这很奇怪,因为视图要求输入)

但是,当我点击按钮时,会发生另一个异常:

friend_add() 缺少 1 个必需的位置参数:'friend'

我对这个问题感到非常困惑。非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

注意path(..) 可从 Django-2.0 获得。

这里的问题是friend在URL中不是

url(r'^add_friend/$', views.friend_add, name="add_friend"),  # no parameter

例如,您可以通过指定 path(..) 为朋友使用主键 (pk):

path(r'add_friend/<b>&lt;int:friend&gt;/</b>', views.friend_add, name="add_friend"),

如果您使用django-1.x,您可以使用带有正则表达式的url(..)

<b>url</b>(r'^add_friend/<b>(?P&lt;friend&gt;[0-9]+)/</b>$', views.friend_add, name="add_friend"),

现在我们可以在反向url中使用好友的主键了:

<input
    type="button"
    class="btn btn-info"
    value="Add Friend"
    onclick="location.href='% url 'user:add_friend' friend=post.poster.pk %';"
>

(多行以便于阅读)。

【讨论】:

注意:path 仅在 django 2.0 中可用。对于 url。 @ABDULNIYASPM 真的很感激!我正要问'路径' 对,我在 url 中遗漏了那个。感谢您的帮助! @ABDULNIYASPM:谢谢。更新了 django-1.x 的备注和替代方案:)。 @WillemVanOnsem 如果您使用的是正则表达式,它不应该是 re_path 而不是旧的捕获语法,如果您使用的是路径捕获语法,则只是文本【参考方案2】:

你的 urlpattern 也应该有这样的朋友参数:

url(r'^add_friend/(?P<friend>[0-9]+)/$', views.friend_add, name="add_friend"),

这将允许您将朋友对象的整数 id 传递给像 add_friend/12 这样的 url。

【讨论】:

哦,对了,那部分不见了,谢谢你的帮助!【参考方案3】:

data-ajax-targethtml 按钮中调用 Django 的特定 URL

<button type="Submit" value="Submit" class="btn btn-outline-light text-dark"  data-ajax-target="% url 'collections' %?collection= collection.collectionID " ">
<span> collection.choice_label </span>
</button>

【讨论】:

以上是关于Django - 按钮网址的主要内容,如果未能解决你的问题,请参考以下文章

Django 视图与网址

Django 网址配置

Django:相同的方法不同的网址

NoReverseMatch 与 Django 网址

1.2Django 视图与网址__进阶

正则表达式 django 网址