【问题标题】:Django -- Generate URL for the webpage of a database objectDjango -- 为数据库对象的网页生成 URL
【发布时间】:2016-04-20 06:14:32
【问题描述】:

我目前正在开发一个 Django 项目,该项目允许用户上传文件(即 .dat、.json 或 .tar.gz),然后将其转换为具有各种关系的适当数据库对象。可以使用 Web 浏览器上的界面或通过 curl 将文件上传到适当的 REST API 端点。该站点目前是一种使用 Bootstrap.js 的单页站点。无论用户是在主页上(显示最近上传的内容)还是点击上传的“黑盒”之一(“黑盒”是由上传文件形成的主数据库对象),浏览器中的 URL 都不会改变。单击黑盒会将用户带到黑盒内的“数据点”列表的页面。

我现在需要的是每个黑盒页面都有自己的 URL,当用户或脚本使用 curl 上传黑盒时,可以在响应中返回该 URL。这是我想在 URLconf 中使用的模式:

r'^bb/(?P<bb_id>[0-9]+)/$'

bb 是“黑盒”的缩写。当现在每个黑盒页面和主页都具有相同的根 URL(开发中,localhost:8000)时,如何系统地使每个黑盒页面都有自己的 URL,遵循这种模式?

我在这样的事情上做了一些尝试(很可能是被误导了)。我尝试过的一件事是使用extends 模板标签为黑盒页面制作单独的模板。前端 Javascript 有一个函数 display_points,它接受一个黑盒 ID 并呈现数据点列表,所以我尝试了各种 hacky 方法从黑盒页面模板中调用该函数(在文件 home.html 中),但是没有什么是成功的。我希望能起作用的一件事是使用 jQuery $.getScript 来做这样的事情:

$.getScript('blackboxes.js', function() { //blackboxes.js is the Javascript from home.html that I copied and pasted--hacky, I know
    display_points({{ bb_id }});
})

但尽管尝试了 Javascript 文件的不同路径,但我尝试像这样使用 $.getScript 时不断收到 404 错误。

另外,为了防止这是这个问题的重要细节,前端使用 Clusterize.js 来帮助加载数据点,因为黑盒通常至少有几千个数据点。

【问题讨论】:

  • 到目前为止你尝试过什么?你能放一些代码,以便我们更好地理解这个问题吗?
  • 我不确定我是否理解。这是客户端的问题吗?您不知道如何在单页应用程序中更改 URL?或者你在浏览器中输入网址时,服务器端不知道如何处理?
  • @freakish 我认为我的问题是前者,我不知道如何在单页应用程序中更改 URL。

标签: javascript python django curl


【解决方案1】:

制作这样的东西的关键之一是在我们的home.html 中使用正确的模板标签,我们将其重命名为base.html,以便更好地描述模板的用途。 urls.py 也进行了修改,以便两个不同的 URL 模式将映射到 views.py 中的同一 base 视图;这两种模式是默认主页的“空白”模式(即r'^$')和查看特定黑盒的模式(r'^blackbox/(?P&lt;bb_id&gt;[0-9]+)/$')。将根据 bb_id(黑盒 ID)是否在 URL 模式中呈现不同的视图。如果没有,将呈现最近上传的默认主页视图;否则,将呈现特定 bb_id 的数据点。在base.html模板中,if模板标签用于查看bb_id是否存在;如果是这样,将调用 JavaScript 函数 display_bb,它接收 bb_id 以了解要显示哪些数据点。否则,将调用函数display_10_recent_blackboxes

另一个问题是发送包含可用于查找和查看刚刚上传的黑匣子的信息的响应。最初,主数据库插入函数insertBlackboxIntoDatabase 将首先创建Blackbox 模型实例,然后用上传的文件创建的数据点填充它。但是,由于响应是在调用该函数之前发送的,因此有必要重构上传和插入代码,以便首先创建黑盒实例,以便其 ID 可以成为响应的一部分。然后,ID 将被传递给不同的上传函数(基于文件类型),每个函数最终都会调用insertBlackboxIntoDatabase,后者现在根据传递给它的 ID 定位 Blackbox 实例,然后继续创建和插入数据点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2011-07-17
    • 1970-01-01
    • 2016-12-04
    • 2010-09-06
    • 2010-10-27
    相关资源
    最近更新 更多