从javascript函数生成django HTML URL - javascript

我正在使用Django 1.10.6并尝试从数据表中的javascript函数生成url

在url.py下,我有一个名为个人资料设置的页面,例如:

app_name = 'myapp'

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

在javascript中,我有一个Django查询,将数据发送到变量,并且数据显示在具有名称和ID字段的表上:

var django_dat =[
    {
        "id": 1,
        "name":       "Jack Spicer",
    },
    {
        "id":2,
        "name":       "Ted Cracker",
    }
    {
        "id":3,
        "name":       "Justin Rollin",
    }
    {
        "id":4,
        "name":       "Boaty Boat",
    }
];

$(document).ready(function() {
    var table = $('#dattable').DataTable({
        data: django_dat,
        columns: [{
          'data': null,
          'render': function(data, type, row, meta)  {
            //Django URL
            return '<a href={% url 'myapp:profile' 2 %}>' + data.name + '</a>';}},
             {
          data: 'id'
        }]
    });
});

我正在尝试更改URL,以便将名称链接到{%url'myapp:profile'data.id%}之类的URL。上面的代码被硬编码为id = 2并且可以工作。

尝试将其更改为:

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

但这给了No Reverse match错误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>'

但是有同样的错误

参考方案

这不是技术问题,而是理解url在Django和JavaScript中如何工作的问题。请记住,模板html文件首先由Django解析和呈现。 Django不在乎JavaScript语法-只是将其视为更多文本。呈现页面后,会将其发送到浏览器并对其进行解释并运行JavaScript。而且,当该过程正在进行时,Django完全无法使用。浏览器永远不会看到Django模板标签。因此,该过程分为两个不同的阶段-Django模板渲染,然后在浏览器中运行JavaScript。

当您使用Django {% url %}标记时,您正在要求Django解析并呈现一个URL,它将使用其内置的URL解析器对其进行查找。您的profile网址需要一个id变量,并且收到的错误消息告诉您Django正在尝试并且无法使用您提供的变量来解析url-这似乎是JavaScript字符串串联。同样,Django不懂JS,因此您实际上给了它一堆垃圾字符。

因此,使您的{% url %}标记起作用的唯一方法是为其提供真实的用户ID,这是Django需要查找相关URL的方式。但是在您的情况下,除非您在JavaScript中选择用户,否则Django将不知道该用户ID是什么。

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

动态构建(使用硬编码的url模式的字符串连接)。使用这种方法会失去可维护性,但是它将是最快实现的方法。如果您以后要更改网址结构,则必须记住要在此处进行更改。
首先从Django提供有效网址列表,然后在选择用户时从该列表中进行选择。如果您的用户列表很小,这将是一个很好的解决方案,并且可以避免对URL进行硬编码的问题。
要具有get_profile_url_for_user(或任何其他)API端点,在JS中选择一个用户时,会将带有该用户ID的ajax请求发送到通用网址,该网址将在Django中进行网址解析,并返回该用户的特定网址轮廓。如果页面上可能有数百个用户,这将是我的首选方法。

html onClick打开url存储在php变量中 - javascript

以下是我的代码,正在获取Uncaught SyntaxError: Unexpected token },但是我的代码中没有看到任何}。 window.open期望用引号引起来的url,我尝试了单引号和双引号的不同组合,但不起作用并且也无法在echo中转义双引号。请帮助谢谢..<?php $a = "https://www.google.co…

Javascript-从当前网址中删除查询字符串 - javascript

单击提交按钮后,我需要从网址中删除查询字符串值。我可以用jQuery做到这一点吗?当前网址:siteUrl/page.php?key=value 页面提交后:siteUrl/page.php 实际上,我已经从另一个带有查询字符串的页面着陆到当前页面。我需要在页面首次加载时查询字符串值以预填充一些详细信息。但是,一旦我提交了表格,我就需要删除查询字符串值。我已…

使用C#和JavaScript绑定HTML - javascript

我想从C#绑定HTML。我尝试了下面的代码HtmlTextWriter.write("<a onclick=\"window.open('', '_blank', 'location=yes,height=570,width=520,scrollbars=yes,status=yes…

Python BeautifulSoup html.parser无法正常工作 - javascript

我有一个脚本可以从Amazon处获取图书信息,该脚本以前曾成功运行,但今天却失败了。我无法弄清楚到底出了什么问题,但我假设它与解析器或Javascript有关。我正在使用以下代码。from bs4 import BeautifulSoup import requests response = requests.get('https://www.am…

如何在python中使用机械化单击? - javascript

我有用于身份验证的表格。但是在这种形式下,没有提交按钮,但是它使用了<input>作为按钮。现在我很困惑如何用MECHANIZE单击这种类型的按钮。 到目前为止,我已经做到了:import urllib import re import mechanize from base64 import b64encode 可以用Java脚本完成吗?br …