0

我已阅读这篇文章:如何在 Knockout javascript 表中创建文本链接?和其他几个人一起。

但是,我在某处遗漏了一些东西,或者没有采取正确的方法。我已经为我的问题包含了相关的代码块。我正在尝试使用敲除生成的表来更新任务或删除任务。删除部分工作正常。我试图让更新链接到另一个用于更新任务的页面。我无法弄清楚我需要做什么才能使链接在更新列中正常工作。

我已经尝试了几种不同的方法来将 url 放入传递给 KO 模型的字典列表中。有什么建议可以引导我朝着正确的方向前进吗?如果我遗漏任何信息,请告诉我。谢谢你。

视图.py

def TaskList(request, job_id):
    job_tasks = Tasks.objects.filter(parent=job_id)

    tasks_list = []
    for task in job_tasks:
        task_row = {}
        task_row['task_id'] = task.task_id
        task_row['t_name'] = task.name
        task_row['date'] = task.date_created
        task_row['state'] = task.state
        task_row['url'] = '{% url tracking:update_task task_id=task.task_id %}'
        tasks_list.append(task_row)

    json_tasks = json.dumps(tasks_list)

    if request.POST:
        json_data = request.POST.get('json_blob')
        obj = loads(json_data)

        task.task_id = obj.get("task_id")
        remove_task = Tasks.objects.get(task_id=task.task_id)
        remove_task.delete()

        messages.success(request, 'Task removed')

HTML

<table>
    <thead>
        <th>Name</th>
        <th>Date</th>
        <th>State</th>
        <th>Update</th>
        <th>Remove</th>
    </thead>
    <tbody data-bind "foreach: tasks">
        <tr>
            <td data-bind="text: t_name"></td>
            <td data-bind="text: date"></td>
            <td data-bind="text: state"></td>
            <td a class="btn" data-bind="attr: {href: url}">Update</a></td>
            <td button class="btn" data-bind="click: $root.remove_task">Remove</button></td>
        </tr>
    </tbody>
</table>

{% block javascript_variables_nocompress %}
window.TASKS = {{ json_tasks|safe }};
{% endblock %}

{% block javascript_compress %}
<script type='text/javascript' src="{% static 'js/knockout/knockout.js' %}"></script>
<script type="text/javascript">    
$(function() {
    var RemoveTaskModel = function () {
        var self = this;
        self.tasks = ko.observableArray(window.TASKS);

        self.remove_task = function(task) {
            self.tasks.remove(task);
            $("#json_blob").val(ko.toJSON(task));
        }
    }
    ko.applyBinding(new RemoveTaskModel());
});
</script>
{% endblock %}

HTML

4

1 回答 1

0

我会使用reverse对每个任务的 URL 进行反向查找:

from django.core.urlresolvers import reverse

def TaskList(request, job_id):
    job_tasks = Tasks.objects.filter(parent=job_id)

    tasks_list = []
    for task in job_tasks:
        ...
        task_row['url'] = reverse('update_task', args=(),
            kwargs={'task_id': task_id})

然后您的 observableArray 应该能够将 JSON 中的属性绑定到锚标记。您可能还注意到,在您的代码示例中,您的 td 格式错误:

<td a class="btn" data-bind="attr: {href: url}">Update</a></td>

它应该是:

<td><a class="btn" data-bind="attr: {href: url}">Update</a></td>
于 2013-10-21T01:23:42.137 回答