我的网站目前在自己的页面上呈现表单。我正试图让它们在我的主页面上的侧边栏div标签内呈现。但是,我无法弄清楚如何塑造JavaScript和/或View,因此我将表单模板的HTML返回并插入div标签。
更新
我在控制台中收到以下错误:GET http://127.0.0.1:8000/new_trend/ 500 (Internal Server Error)
HTML (我希望将表单模板注入的主页上的标记):
<div id="sidebar">
</div>
的JavaScript
$(function() {
$("#new-trend").click(function(event){
alert("User wants to add new trend"); //this works
$.ajax({
type: "GET",
url:"/new_trend/",
success: function(data) {
$('#sidebar').html(data),
openNav()
}
})
});
});
查看
def new_indicator(request):
# if this is a POST request we need to process the form data
if request.method == "POST":
# create a form instance and populate it with data from the request:
form = IndicatorForm(request.POST)
# check whether it's valid:
if form.is_valid():
indicator = form.save(commit=False)
indicator.author = request.user
indicator.modified_date = timezone.now()
indicator.save()
return redirect('dashboard')
else:
form = IndicatorForm()
return render(request, 'mysite/sidebar_trend.html', {'form': form})
答案 0 :(得分:1)
我能够自己解决这个问题。对于遇到此问题的其他人(包括我自己!),这里是我如何运作的。
<强>的JavaScript 强>
这里有几个修复。首先,你需要包含csrftoken,你可以通过另一个JS函数。其次,AJAX请求需要是POST,而不是GET(不知道为什么,如果你知道请在下面评论)。这是更新的代码段...
// Get cookie for CSRF token (from Django documentation)
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
};
// Load new Trend form
$(function() {
$("#new-trend").click(function(event){
var csrftoken = getCookie('csrftoken');
$.ajax({
type: "POST",
url: "/new_trend/",
data: {'csrfmiddlewaretoken': csrftoken},
success : function(data) {
$('#sidebar').html(data);
openNav()
}
})
alert("User wants to add new trend") //this works
});
});
查看强>
需要纠正的第二件事是View功能。首先,您需要将HTML呈现为字符串,然后在HttpResponse中返回该字符串。 This blog post详细解释了为什么我不打算在此处进行讨论。这就是新代码的样子......
@login_required
def ajax_indicator_form(request):
form = IndicatorForm()
html = render_to_string('mysite/sidebar_trend.html', {'form': form})
return HttpResponse(html)