Я пытаюсь создать диалог, когда пользователь нажимает кнопку, но все равно получаю сообщение об ошибке. Это код, который у меня есть.

Для заметки, я использую 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 равным чему-то вроде «Это какой-то текст», он сработает, но я не уверен, что делаю не так.

2
Iteria 7 Апр 2014 в 01:51

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)
4
knbk 7 Апр 2014 в 02:17