Как я могу POST модель объекта для использования в представлении через ajax? - PullRequest
0 голосов
/ 23 октября 2009

Я работаю над моим вопросом подсчета хитов и столкнулся с другим камнем преткновения: как мне опубликовать информацию о модели объекта через ajax?

Я использую общее представление object_detail для ряда моих моделей, и я хочу добавить ajax в шаблон, который вызывает мою функцию updapte_object_hit_count (таким образом, отслеживая количество обращений объекта).

Но поскольку данные передаются через 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, но не уверен, как ...

Ответы [ 2 ]

1 голос
/ 23 октября 2009

Используйте пользовательский фильтр, как описано Майклом, и используйте django.db.model.get_model, чтобы получить объекты, которые я предоставляю в качестве имени приложения и модели

Чтобы получить обе информации одновременно, пользовательский тег может быть более полезным, чем фильтр

больше информации о get_model в этой статье: http://www.b -list.org / weblog / 2006 / jun / 07 / django-tips-write-better-template-tags /

1 голос
/ 23 октября 2009

Возможно, вы могли бы создать собственный фильтр ( 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 }}

Единственный другой способ, которым я могу придумать, - это добавить свойство в модель. Этот способ означает, что вам не нужно изменять модель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...