Я пытаюсь создать диалог, когда пользователь нажимает кнопку, но все равно получаю сообщение об ошибке. Это код, который у меня есть.
Для заметки, я использую django-braces для перехвата вызовов ajax.
Посмотреть:
class UserRegistration(braces.AjaxResponseMixin, CreateView):
form_class = UserRegistrationForm
template_name = "registration_form.html"
def get_ajax(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
rendered = render_to_string(self.template_name, context_instance=context)
return HttpResponse(rendered)
Javascript:
$("#signup").on("click", function(){
$("body").append("<div id='dialog' title='Register'></div>");
$( "#dialog" ).dialog({
height: 'auto',
width: 'auto',
modal: true,
autoOpen: false
});
$.ajax({
url: '/signup/',
data: {},
type: 'GET',
success: function(data){
$("#dialog").html(data);
$("#dialog").dialog("open");
},
error: function(error) {
alert("failure");
}
});
});
Я знаю, что это как-то связано с render_to_string
, потому что если я просто установлю rendered
равным чему-то вроде «Это какой-то текст», он сработает, но я не уверен, что делаю не так.
1 ответ
Параметр context_instance
в render_to_string
ожидает экземпляр Context
, а get_context_data
возвращает словарь. Есть несколько способов решить эту проблему:
1) Предоставьте экземпляр Context
, предпочтительно RequestContext
. RequestContext
выполнит все процессоры контекста, поэтому для шаблона доступны переменные по умолчанию, такие как request
и user
:
from django.template import RequestContext
def get_ajax(self, *args, **kwargs):
context = self.get_context_data(**kwargs)
rendered = render_to_string(self.template_name,
context_instance=RequestContext(self.request, context))
return HttpResponse(rendered)
2) Передайте контекст как словарь, используя параметр dictionary
:
def get_ajax(self, *args, **kwargs):
context = self.get_context_data(**kwargs)
rendered = render_to_string(self.template_name, dictionary=context)
return HttpResponse(rendered)
3) Поскольку вы просто передаете отрисованную строку в объект HttpResponse
, вы можете пропустить render_to_string
и использовать вместо него render
:
from django.shortcuts import render
def get_ajax(self, *args, **kwargs):
context = self.get_context_data(**kwargs)
return render(self.request, self.template_name, context)
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.