从javascript函数生成Django HTML URL

2024-04-26 10:02:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用django1.10.6并尝试从datatables中的javascript函数生成url

低于网址.py我有一个叫做配置文件设置的页面,比如:

app_name = 'myapp'

urlpatterns = [
    url(r'^profile/(?P<pk>[0-9]+)/$', views.ProfileView.as_view(), name='profile'),
]

在javascript中,我有一个django查询将数据发送到一个变量,数据显示在一个带有name和id字段的表上:

^{pr2}$

我正在尝试更改URL,以便它将名称链接到类似{%URL'的URLmyapp:配置文件' 数据.id%}. 以上代码为2。在

尝试将其更改为:

return '<a href={% url 'myapp:profile' '+ data.id+ ' %}>' + data.name + '</a>' 

但这给出了一个无反向匹配错误Reverse for 'profile' with arguments '('+ data.id+ ',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['profile/(?P<pk>[0-9]+)/$']

还尝试使用replace函数:

return '<a href={% url 'myapp:profile' uid %}>'.replace('uid', data.id) +  data.name + '</a>'

但也有同样的错误


Tags: 数据函数nameidurldatareturn配置文件
3条回答

因此,我尝试了两种使用JavaScript函数生成URL的解决方案:

function linkgen(app_page, link_id, display_txt){
    let tag_head ="<a href={% url '",
        tag_head2 =" %}>",
        tag_tail ='</a>'
    return tag_head.concat(app_page,"' ", link_id, tag_head2, display_txt, tag_tail )
}

function hardgen(app_page, link_id, display_txt){
    let tag_head ="<a href='http://localhost:8000/",
        tag_head2 ="/'>",
        tag_tail ='</a>'
    return tag_head.concat(app_page,"/", link_id, tag_head2, display_txt, tag_tail )
}

第一个生成Django样式{%URL link%},第二个生成硬http://链接。硬链接工作得很好。但是在进行生产时,必须确保更改基url。在

^{pr2}$

但是django生成的链接做了一些有趣的事情。在

{ data: null, "render": function(data, type, row, meta) {
                console.log(linkgen('myapp:profile', data.id, data.name))
            return  linkgen('myapp:profile', data.id, data.name)
             ; }},

控制台日志将返回正确的链接,如果您将其粘贴到return中,它将正常工作,但由于django的设置方式,生成的字符串不会返回。在

如果我理解正确的话,我想你应该这样做:

return "<a href={% url 'myapp:profile' " + data.id + ' %}>' + data.name + '</a>' 

在您当前的表单中,myapp:profile将被解释为javascript变量,因为您是由于嵌套的单引号而不加引号的(它不是有效的javascript变量名)。在

这不是技术问题,而是理解url在Django和JavaScript中如何工作的问题。记住,模板html文件首先由Django解析和呈现。Django不关心JavaScript语法-它只是将其视为更多的文本。一旦页面被呈现出来,它就会被发送到浏览器,在那里它会被解释并运行JavaScript。而当这个过程正在进行时,Django就完全不可能了。浏览器永远看不到Django模板标记。因此流程有两个不同的阶段-Django模板呈现,然后在浏览器中运行JavaScript。在

当您使用Django{% url %}标记时,您要求Django解析并呈现一个URL,它将使用其内置的URL解析器查找该URL。您的profileurl需要一个id变量,您得到的错误消息是Django正在尝试使用您给定的变量解析url,但失败了,这看起来是一个JavaScript字符串连接。同样,Django不理解JS,所以你实际上给了它一堆垃圾字符。在

因此,让您的{% url %}标记正常工作的唯一方法是给它一个真正的用户id,这正是Django查找相关URL所需要的。但是在您的例子中,Django在JavaScript中选择用户之前不会知道该用户id是什么。在

在JavaScript中获取有效url的一些可能方法是:

  1. 动态构建(使用硬编码url模式的字符串连接)。使用此方法将失去可维护性,但它将是实现速度最快的方法。如果你以后改变你的网址结构,你必须记得回来改变它在这里。在
  2. 最初从Django传递一个有效url列表,然后在选择用户时从该列表中进行选择。如果用户列表很小,这将是一个很好的解决方案,并且可以避免硬编码url的问题。在
  3. 为了有一个get_profile_url_for_user(或其他)API端点,在JS中选择一个用户时,ajax请求将与该用户id一起发送到一个通用url,该url将在Django中进行url解析,并返回该用户配置文件的特定url。如果页面上可能有数百个用户,这将是我的首选方法。在

相关问题 更多 >