django: ввод и вывод на одной странице
я совершенно новичок в django и изо всех сил пытаюсь сделать что-то очень простое.
У меня есть ModelForm
для следующей модели:
class Queries(models.Model):
user_id=models.CharField(max_length=200)
query=models.CharField(max_length=200)
и я показываю пользователю простую форму, которая поможет сделать следующее:
- пользователь задаст вопрос
вопрос будет обработан(будет создан запрос базы данных на основании вопроса)
тогда результат запроса должен быть показан чуть ниже форма в та же страница.
вот как мой views.py выглядит так:
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render
from basicapp.models import QueryForm
def index(request):
form=MyForm()
real_form=form.getForm(request)
response=form.response
return render(request,'basicapp/index.html',{
'form': real_form,
'response':response,
})
class MyForm:
response=''
def getForm(self,request):
form = QueryForm(request.POST)
if form.is_valid():
response=form.cleaned_data['query']
form.save()
return form
пока я пробую простые материалы, я беру значение в поле запроса формы и пытаюсь отправить его обратно на страницу;до сих пор мне не удалось. Это индекс.HTML-код:
<form action=" " method="post">{% csrf_token %}
{{ form }}
<p>{{response}}</p>
<input type="submit" value="Submit" />
</form>
если бы я мог это сделать, я думаю, что запросы не будут такими жесткими.Форма работает нормально,данные сохраняются в базе данных. Только response
строка views.py
не может быть восстановлено внутри index.html
после отправки формы. Не могли бы вы помочь?
изменить:
Пробовал следовать в index.html
на основе ответа Хоффа:
<form id="myForm" action=" " method="get">{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
<div id="response">
</div>
<script language="JavaScript">
$(document).ready(function() {
$("#myForm").submit(function() { // catch the form's submit event
$.ajax({ // create an AJAX call...
data: $(this).serialize(), // get the form data
type: $(this).attr('GET'),
success: function(response) { // on success..
$("#response").html(response); // update the DIV
}
});
return false;
});
});
</script>
по-прежнему не повезло : (
4 ответов
views.py
def index(request):
questions=None
if request.GET.get('search'):
search = request.GET.get('search')
questions = Queries.objects.filter(query__icontains=search)
name = request.GET.get('name')
query = Queries.object.create(query=search, user_id=name)
query.save()
return render(request, 'basicapp/index.html',{
'questions': questions,
})
HTML-код
<form method="GET">
Question: <input type="text" name="search"><br/>
Name: <input type="text" name="name"><br/>
<input type="submit" value="Submit" />
</form><br/><br/>
{% for question in questions %}
<p>{{question}}</p>
{% endfor %}
вам нужен асинхронный пост (ajax), который легко с jQuery, см. Этот ответ для полного решения: как опубликовать форму django с помощью AJAX & jQuery
<input type="text" name="query" />
<input type="submit" name="submit" value="Submit" />
вы можете проверить, была ли форма отправлена или нет (i.e если это запрос post или нет):
if 'submit' in request.POST: #you could use 'query' instead of 'submit' too
# do post related task
# add context variables to render post output
# add another context variable to indicate if it's a post
# Example:
context.update({'post_output': request.POST.get('query','')})
...
return render(request, 'index.html', context)
затем в шаблоне проверьте, является ли контекстная переменная post_output
существует, если он показывает вывод:
{% if post_output %}
Output: {{ post_output }}
{% endif %}
Короче говоря, логика:
- проверьте, если соответствующий
request.POST
ключ dict существует или нет в вашем представлении. - если ключ существует, то это post-запрос; добавьте связанные с post переменные контекста и сделайте post related задачи.
- Проверьте, доступна ли в шаблоне какая-либо связанная с сообщением контекстная переменная, и если да, покажите связанный с сообщением вывод.
если вы не хотите показывать вывод, когда страница просто обновляется после публикации, передайте request
объект шаблона и сделать проверку, как это:
{% if request.POST.submit and post_output %}
после ответа Хоффа...
добавить атрибут URL в вызов ajax:
$(document).ready(function() {
$("#myForm").submit(function() { // catch the form's submit event
$.ajax({ // create an AJAX call...
data: $(this).serialize(), // get the form data
type: $(this).attr('GET'),
url: '/URL-to-ajax-view/',
success: function(response) { // on success..
$("#response").html(response); // update the DIV
}
});
return false;
});
});
некоторый обработчик ajax в views.py:
# /URL-to-ajax-view/
def ajax_get_response(request):
if request.method == "GET" and request.is_ajax:
form = QueryForm(request.POST or None)
if form.is_valid():
form.save()
return HttpResponse(form.response)
raise Http404
пробовал что-то подобное?