#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
настройке`. Если вы не пытаетесь изменить объекты запроса или ответа, и вам просто нужна переменная во всех представлениях, которые отображают шаблоны, тогда выберите контекстные процессоры вместо промежуточного программного обеспечения.