从 javascript 函数生成 django HTML URL

ccs*_*csv 3 javascript python django function

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

在 url.py 下,我有一个名为 profile setup 的页面,例如:

app_name = 'myapp'

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

在 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'
        }]
    });
});
Run Code Online (Sandbox Code Playgroud)

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

尝试将其更改为:

return '<a href={% url 'myapp:profile' '+ data.id+ ' %}>' + data.name + '</a>' 
Run Code Online (Sandbox Code Playgroud)

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

还尝试使用替换功能:

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

但得到了同样的错误

Chi*_*idG 5

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

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

所以,让你的{% url %}标签工作的唯一方法是给它一个真实的用户 ID,这是 Django 查找相关 URL 所需要的。但是在您的情况下,在您在 JavaScript 中选择用户之前,Django 不会知道该用户 ID 是什么。

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

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

编辑 - 3 年后回到这个话题 - 我想我在此期间学到了一些东西!还有第四个选项看起来好多了: 4. 假设您的用户数据列表首先来自您的 Django 应用程序 - 您可以在该对象中包含每个用户的个人资料 url,方法是在 Django 应用程序中的任何位置反转 url用户正在被序列化为 JSON。

{
    "id":4,
    "name": "Boaty Boat",
    "profile_url": "http://django-host/profile/4"
}
Run Code Online (Sandbox Code Playgroud)