【问题标题】:Handling similar functionality but from different page origins in a Django Ajax web app在 Django Ajax Web 应用程序中处理类似的功能,但来自不同的页面来源
【发布时间】:2014-04-16 16:33:44
【问题描述】:

我将 Django 和prototype.js 用于Ajax 风格的Web 应用程序。我已经有了一些经验,但总的来说还是网络编程方面的新手。

我已经将我的 Web 应用程序设计成这样(我认为这是直截了当的):

HTML 页面由多个 div 元素组成,这些元素代表与用户交互的不同模块。有一些链接指向 Javascript 函数(“onclick”),这些函数又通过 Ajax 请求调用 Django 服务器框架。这会在 Django 框架中执行视图方法,这些方法会执行一些功能性工作(更改数据库中的数据),然后最终更新用户单击链接的页面的相关部分(div)。

到目前为止一切顺利。

现在的问题是我发现自己面临这样一个事实,即不同部分中的不同链接应该执行相同的功能,但应该更新不同的 div 作为调用它们的函数。

示例: 我有一个部分或页面 A,其中列出了用户的所有订单。 旁边应该有一个取消订单的链接。 点击它应该取消订单(功能性的东西),然后更新页面 A 中的订单列表。

还有另一个页面 B,其中我有一个特定字段的订单列表。 同样,应该可以通过单击链接取消。 它应该执行与上面相同的功能,但现在使用按字段列表的订单更新页面 B。

我想知道如何分解常见的功能性东西。

天真的方法是 页面 A 链接 -> onclick(cancelOrderA) -> js:cancelOrderA() -> 对 url/cancelOrderA 的 Ajax 请求 -> Django 视图函数 A -> 渲染新页面 A 页面 B 链接 -> onclick(cancelOrderB) -> js:cancelOrderB() -> 对 url/cancelOrderB 的 Ajax 请求 -> Django 视图函数 B -> 渲染新页面 B

所以我发现自己编写了所有这些函数(javascript 和 Django 视图),尽管它执行相同的功能代码。

当然我可以写一个python函数来封装常用的功能代码。 但我觉得我仍然需要上面所有不同的胶水功能。 我是否需要为每个操作提供专用的 Django-url 和 -view? 每个动作都需要一个专用的 Javascript 函数吗?

我这里有什么误解吗? 遇到这种情况,你们是怎么处理的?

【问题讨论】:

    标签: ajax django django-views prototypejs


    【解决方案1】:

    您能否将调用的 javascript 函数和视图抽象为更通用?

    例如

    // before
    var cancelOrderA = function(...) {
        // ...
        $.ajax({
            type: 'POST',
            url: '/path/to/cancelOrderA',
            data: { ... },
            },
    });
    
    var cancelOrderB = function(...) {
        // ...
        $.ajax({
            type: 'POST',
            url: '/path/to/cancelOrderB',
            data: { ... },
            },
    });
    

    ...变成:

    var cancelOrder = function(order_type, ...) {
        // ...
        $.ajax({
            type: 'POST',
            url: '/path/to/cancelOrder',
            data: {'type': order_type, ... },
            },
    });
    
    // ...
    
    cancelOrder('Application', ...);
    

    所以现在在您的后端 Django 视图中,您可以使用以前没有的字符串参数...

    # views.py
    from django.db.models.loading import get_model
    
    def cancel_object(request):
        model_type = request.POST['order_type']  # e.g. "Application"
        id = request.POST['id']
    
        get_model('myApp', model_type).get(id=int(id)).cancel()
    
        return HttpResponse(...)
    

    【讨论】:

    • 我想你没有明白我想说的话。实际上,两者的订单类型相同。应该为两者执行完全相同的功能。唯一的区别是它们必须各自产生不同的 HttpResponse,因为它们是从页面的不同部分调用的,因此需要 Ajax 替换不同的 div。
    猜你喜欢
    • 2011-09-22
    • 2018-04-30
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多