javascript - 从 javascript 函数生成 django HTML URL

标签 javascript python django function

我正在使用 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>' 

但这给出了“无反向匹配”错误 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>'

但遇到了同样的错误

最佳答案

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

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

因此,让您的 {% url %} 标记发挥作用的唯一方法是为其提供一个真实的用户 ID,这是 Django 查找相关 URL 所需的。但在您的情况下,Django 不会知道该用户 ID 是什么,直到您在 JavaScript 中选择用户。

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

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

编辑 - 三年后回到这个 - 我想我同时学到了一些东西!还有第四种选择,看起来更好: 4. 假设您的用户数据列表首先源自您的 Django 应用程序 - 您可以在该对象中包含每个用户的配置文件 url,方法是在 Django 应用程序中将用户序列化为 JSON 时反转该 url。

{
    "id":4,
    "name": "Boaty Boat",
    "profile_url": "http://django-host/profile/4"
}

关于javascript - 从 javascript 函数生成 django HTML URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060694/

相关文章:

javascript - 向事件发射器附加和删除事件

python - 从任何目录打开文件

python - celery :启动时启动任务

django - 如何在 Django 中创建子应用程序?

python - Django:每次请求都是 404

php - json_encode 数组的问题

javascript - AlpineJS 函数内调用函数

javascript - 如何将一堆数组转换为单个对象?

python - 生成器表达式和。列表推导

python - 为什么我的解决方案打印在一个列表中而不是逐项打印?