Получение данных из формы промежуточного программного обеспечения с использованием jQuery в Django

#jquery #django

#jquery #django

Вопрос:

У меня есть промежуточное программное обеспечение, подобное этому:

 class PostModelFormMiddleware(object):

def process_request(self, request):

    form = PostModelForm()
    request.post_form = form
  

В этой форме есть поле captcha. Я хочу, чтобы в моем шаблоне происходило то, что каждый раз, когда пользователь нажимает Отправить, вопрос captch обновляется с помощью Javascript на новый. Как мне получить это request.post_form и его данные в jQuery?

Спасибо!

РЕДАКТИРОВАТЬ: Больше кода.

HTML:

    <form id="add_post">
...
        <input type="hidden" name="math_captcha_question" value="fbc9fcdffbf2b2723ab36e9f341372214daf1be936202d2035">
    6 - 5 = 
...
    </form>
  

Я хотел бы изменить значение «math_captch_question», а также отображаемый текст. Оба они изначально отображаются с использованием тега template {{request.post_form.math_captcha_question}}

jQuery:

  $("form#add_post").submit(function() {
 //Validations and stuff
            var data = {category:category, body:body, nickname:nickname, math_captcha_question:math_captcha_question, math_captcha_field:math_captcha_field};
            var args = {type:"POST", url:"add_post/", data:data, complete:function(res, status) {
                //Process response
                //This is where I would like to set new values for math_captcha_question

            } };

            $.ajax(args);
        }


        return false;

    })
  

/add_post/ просмотр:

 def add_post(request):
    if request.method == 'POST':

        if form.is_valid():
           #do stuff
           return HttpResponse("success")

        else:
            return HttpResponseServerError("fail")
  

Ответ №1:

Сначала вы должны вывести форму в своем шаблоне, присвоить ей id или другой идентификатор, а затем вы сможете получить к ней доступ через jQuery.

 <form id="myform" ...>
    {{request.post_form}}
</form>
  

Редактировать: Я предполагаю, что у вас есть 'django.core.context_processors.request' в ваших TEMPLATE_CONTEXT_PROCESSORS настройках.

Обновление (согласно комментариям ниже):

Вашему add_post представлению нужно вернуть что-то в ответе, с чем jQuery.ajax можно справиться. Если он просто возвращает "success" , в ответе будет только обычный текст. Чтобы упростить это, вы должны вернуть новое math_captcha_question значение:

 def add_post(request):
    if request.method == 'POST':
       #fill some data in the form
       form = PostModelForm(request.POST)
       if request.post_form.is_valid()
            math_captcha_question = form.cleaned_data["math_captcha_question"]
            return HttpResponse(math_captcha_question)
       else:
            return HttpResponse("error")
  

Затем при обратном вызове в jquery вы можете обрабатывать полученные значения и соответствующим образом выдавать удобный для пользователя ответ. У вас при complete обратном вызове:

 function(res, status) {
    if (res!="error") {
        $("form#add_post #id_math_captcha_question").attr("value", res);
    } else {
        //show some error to your user
    }
}
  

Комментарии:

1. Привет, спасибо за ваш ответ. Да, у меня уже есть это в шаблоне. Чего я не знаю, как сделать, так это получить новую форму, которую промежуточное программное обеспечение выдает через jQuery. Я знаю, как заменить старое значение новым значением с помощью jQuery. Это новое значение является плавающим… где-то… Я пытался разобраться с этим через Firebug, но не смог его найти. Идеи?

2. Хм, не могу реально помочь без некоторого фрагмента кода с вашей стороны (часть jQuery, в которой вы хотите заменить значение для поля в форме).

3. Я предполагаю, что вы получаете новое значение для math_captcha_question из ответа на запрос POST? Перед использованием jQuery я бы посоветовал вам добавить id или class к math_captcha_question входным данным. Предполагая, что id это "id_math_captcha_question" , вы должны быть в состоянии сделать что-то вроде $("form#add_post #id_math_captcha_question").attr("value", new_value_from_post_response); в строках, которые вы упомянули в вашем JS.

4. Хорошо, тогда, я думаю, еще одно последнее дополнение к коду: как выглядит ваше представление, обрабатывающее запрос post на URL «add_post /»? Кстати. «add_post/» выглядит как относительный URL. Возможно, лучше использовать kike абсолютного URL «/ add_post /», просто чтобы избежать проблем с зависимостью URL.

5. О проверке контекстных процессоров docs.djangoproject.com/en/dev/ref/templates/api /… . Это намного проще, чем иметь дело с промежуточным программным обеспечением. Каждое представление, которое отображается с помощью context_instance = RequestContext(request) , затем будет использовать context_processors, предоставленные в TEMPLATE_CONTEXT_PROCESSORS настройке`. Если вы не пытаетесь изменить объекты запроса или ответа, и вам просто нужна переменная во всех представлениях, которые отображают шаблоны, тогда выберите контекстные процессоры вместо промежуточного программного обеспечения.