我对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
现在我正在尝试简单的东西,我在表单的查询字段中获取值并尝试将其发送回页面;到目前为止,我失败了。 这是index.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>
仍然没有运气:(
答案 0 :(得分:11)
<强> 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 %}
答案 1 :(得分:3)
你需要的是一个异步帖子(ajax),使用jQuery很容易,请参阅这个答案以获得完整的解决方案:How to POST a django form with AJAX & jQuery
答案 2 :(得分:2)
<input type="text" name="query" />
<input type="submit" name="submit" value="Submit" />
您可以查看表单是否已提交(即如果是否是提交请求):
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键。 如果您不希望在帖子后简单刷新页面时显示输出,请将request
对象传递给模板并执行以下检查:
{% if request.POST.submit and post_output %}
答案 3 :(得分:1)
跟随霍夫的回答......
将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;
});
});
views.py中的一些ajax处理程序:
# /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
尝试过这样的事情?