1

我在表格中的页面上有文章列表,我想通过单击按钮使用 ajax 对其进行排序。

我使用 dajaxice,它将对 ajax.py 的请求发送到example1方法,并在my_js_callback中获取响应 JSON 数据

HTML:

<script>
function my_js_callback(data) {
    alert(data)
    $("#article_view_tbody").html("")
    for (i=0;i<data.length;i++)
         article=data[i]
     $("#article_view_tbody").append("<tr><td>" + data[i].title...) // here i need to set url for article edit
}
</script>
<button type="button" onclick="Dajaxice.content.example1(my_js_callback);">Click Me!</button>
<table>
<tbody id="article_view_tbody">
    {% for article in articles %}
        <tr>
            <a class="article_link" href="{% url article_detail article.id %}">
                    {{ article.title }}
        </a>
            </td>
         </tr> ...

ajax.py:

from django.utils import simplejson
from django.core import serializers
from dajaxice.decorators import dajaxice_register
from models import Article

def get_by_date_queryset():
      return Article.objects.all().order_by('created_on')

@dajaxice_register    
def example1(request):
    """ Handling sorting requests """
    queryset = get_by_date_queryset()
    json_serializer = serializers.get_serializer("json")()
    return json_serializer.serialize(queryset, ensure_ascii=False)

我无法在 JS 中传递 {% url %} 标签。那么这是一种在不附加 js 数据的情况下使用 ajax 重新加载 tbody 的方法吗?

4

1 回答 1

2

您可以返回一个包含以下格式的每个元素的列表,而不是简单地序列化查询集并返回它:

    return [
        {
            'pk': article.pk,
            'title': article.title,
            'url': reverse('view_article', args=(article.pk,))  # Or, use article.get_absolute_url()
        }
    for article in queryset]

您可以使用 JavaScript 简单地遍历返回的 JSON,并articles[i].urlfor(var i = 0;...循环中使用来获取 URL、标题等。

更新(回复:“硬编码的坏方法”):

只需使用:

serialized = json_serializer.serialize(queryset, ensure_ascii=False)
loaded = json.loads(serialized)
for row in loaded:
    row['url'] = reverse('view_article', args=(row['pk'],))
return json.dumps(loaded)

这也有助于将 the"fields"与 the分开"url"(感觉更正确)。

于 2012-06-18T13:57:39.287 回答