【问题标题】:How do I POST an object's model for use in a view via ajax?如何通过 ajax 发布对象模型以在视图中使用?
【发布时间】:2009-10-22 23:54:40
【问题描述】:

正在处理我之前的hit count question 并遇到了另一个绊脚石:如何通过 ajax 发布对象的模型信息?

我正在为我的一些模型使用通用的object_detail 视图,并且我想向调用我的updapte_object_hit_count 函数的模板添加一些ajax(从而跟踪对象的命中计数)。

但由于数据是通过 json/ajax 传递的,我不确定如何确定我正在使用哪个模型/对象。

比如我想做的事(jQuery):

$(document).ready(function() {

    var data = {
        model : "{{ object.model }}", // this doesn't work, obviously
        pk    : "{{ object.pk }}",
        };

    $.post('{% url update_object_hit_count %}',data);

});

在我看来,像这样聪明的东西:

def update_object_hit_count(request):
    post = request.POST.copy() 
    model = post['model']
    obj = model.objects.get(pk=post['pk'])
    # more stuff using this obj

关于如何做到这一点的任何想法?我以为我可以使用 ContentType 但不确定如何...

【问题讨论】:

    标签: jquery ajax django


    【解决方案1】:

    您或许可以创建一个自定义过滤器 (django docs)。

    当前代码尝试(社区 Wiki):

    from django import template
    
    register = template.Library()
    
    @register.filter
    def app_label(value):
        """Return an object's app_label"""
        try:
            return value._meta.app_label
        except:
            pass
    
    @register.filter
    def object_name(value):
        """Return an object's object_name"""
        try:
            return value._meta.object_name
        except:
            pass
    

    然后在你的模板中:

    {% load ... %}
    
    {{ object|app_label }}
    {{ object|object_name }}
    

    我能想到的唯一其他方法是向模型添加属性。这种方式意味着您不必修改模型

    【讨论】:

    • 我没想到 - 谢谢。是个好主意。我只需要看看如何转身并获取模型的文本表示并检索实际对象......但我知道答案就在那里。
    • 干杯,正如 vikingosegundo 提到的应用程序名称可能很有用....我也没有添加错误检查。我已经制作了这个帖子社区 wiki,因此您可以根据需要进行改进
    • 我添加了我正在使用的代码,其中有try/except(虽然不是很聪明)。
    【解决方案2】:

    使用 michael 描述的自定义过滤器并使用 django.db.model.get_model 检索我提供的应用程序名称和模型名称的对象

    要同时检索这两个信息,自定义标签可能比过滤器更有用

    本文中有关get_model的更多信息:http://www.b-list.org/weblog/2006/jun/07/django-tips-write-better-template-tags/

    【讨论】:

    • 我认为这将是完美的组合!我将使用过滤器,因为它似乎工作并且非常简单。在我的 ajax 视图中使用 get_model 将满足我的需要。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多