【发布时间】:2017-08-11 23:55:28
【问题描述】:
我正在尝试将参数传递给模板中的 django URL。网址配置为:
url(r'^reviewrecord/(?P<pk>\d+)/$', views.MyView, name='reviewrecord')
现在,我从 javascripyt 函数中的 ajax 块调用它。 javascript函数声明为:
function EditDialog(pk) {
$.ajax(
{
url: "{% url 'reviewrecord' pk=pk %}",
type: "POST",
data: postData,
});
}
这样做会导致:
Reverse for 'reviewrecord' with arguments '()' and keyword arguments '{u'pk': ''}' not found. 2 pattern(s) tried: ['reviewrecord/$', 'reviewrecord/(?P<pk>\\d+)/$']
但是,我已经验证,如果我硬编码 pk 值,它就可以工作。因此,将 url 参数替换为:
url: "{% url 'reviewrecord' pk=5 %}",
这行得通。所以,不知何故,我无法在 URL 标记的 JS 函数中引用传递的 pk 值。
根据下面的 cmets,我可以做到以下几点:
function EditDialog(pk) {
$.ajax({
url: "{% url 'populatereviewform' %}",
method: 'GET',
data: {
pk: pk
},
success: function(formHtml){
//place the populated form HTML in the modal body
$('.modal-body').html(formHtml);
$( "#dialog" ).modal({width: 500, height: 500});
},
dataType: 'html'
});
这确实显示了正确填充所有内容的对话框。
我不确定如何在这种情况下实现类似的效果。我试过类似的东西:
var postData = $("#review-form").serializeArray();
$.ajax(
{
url: "{% url 'reviewrecord' pk %}",
type: "POST",
data: {
data: postData,
pk: pk,
});
这更像是一次绝望的尝试,但没有奏效。
编辑
HTML模板如下:
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Cloud | Review data {% endblock %}
{% block content %}
{% load static %}
{% load render_table from django_tables2 %}
<div id="dialog" class="modal" title="Edit" style="display:none">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span></button>
<h4 class="modal-title">Review Uploaded Image</h4>
</div>
<div class="modal-body">
</div>
</div>
</div>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.js"></script>
<link rel="stylesheet" type="text/css" href="{% static "project.css" %}" />
<script>
// using jQuery
function EditDialog(pk) {
$.ajax({
url: "{% url 'populatereviewform' %}",
method: 'GET',
data: {
pk: pk
},
success: function(formHtml){
//place the populated form HTML in the modal body
$('.modal-body').html(formHtml);
$( "#dialog" ).modal({width: 500, height: 500});
},
dataType: 'html'
});
$("#dialog").submit(function(e)
{
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
var postData = $("#review-form").serializeArray();
$.ajax(
{
url: "{% url 'reviewrecord' pk=pk %}",
type: "POST",
data: postData,
success:function(data, textStatus, jqXHR)
{
//var transformed = data.replace('/-1/g', pk.toString())
$('.modal-body').html(data);
},
error: function(jqXHR, textStatus, errorThrown)
{
alert(errorThrown);
}
});
e.preventDefault();
e.unbind(); //unbind. to stop multiple form submit.
});
return false;
}
</script>
{% if reviews %}
<div class="function-page">
<div class="table-form">
<div class="function-container">
{% render_table reviews %}
</div>
</div>
</div>
{% else %}
<div class="form">
<div class="figcaption">Looks like you are all caught up! There is nothing to review.</div>
</div>
{% endif %}
{% endblock %}
【问题讨论】:
-
好像pk没有传值。你确定它有价值吗?
-
也试过了。结果:
Reverse for 'reviewrecord' with arguments '('',)' and keyword arguments '{}' not found. 2 pattern(s) tried: ['reviewrecord/$', 'reviewrecord/(?P<pk>\\d+)/$'] -
这有什么惊人的? Django 模板标签是在服务器端渲染的,远在 JS 可以运行之前。
-
对...那么,在这种情况下传递此参数的方法是什么...
-
我过去这样做的方法是在模板标签中放入一个不可能的值-例如
00000-然后使用JS中的字符串.replace()方法将其替换为实际值。
标签: javascript ajax django django-templates