我确信这不是一个复杂的问题,但我已经在这里停留了很长时间,希望得到你们的帮助,非常感谢任何帮助。谢谢!!!!
我认为需要使用"追加"来自ajax的功能。但我真的不确定如何编写正确的views.py和脚本。请在下面看我的片段,并给我你宝贵的更正。
我当前的代码返回错误" ResultView缺少QuerySet。"
图片不言自明。用户输入信息,然后单击“提交”,然后根据这些信息过滤数据库。最后在同一页面显示结果。
models.py
class Input(models.Model):
company=models.CharField(max_length=100)
region=models.CharField(max_length=100)
class Result(models.Model):
sales=models.IntegerField(blank=False,null=False)
employee=models.IntegerField(blank=False,null=False)
forms.py
class InputForm(forms.ModelForm):
company=forms.CharField(widget=forms.TextInput, label="Company",error_messages={'required': 'Please enter the company name'},required=True)
#region(here shows a dropdown list, here is correct)
iquery = Result.objects.values_list('region', flat=True).distinct()
iquery_choices = [('', 'None')] + [(region,region) for region in iquery]
region = forms.ChoiceField(choices=iquery_choices)
网址
URL(R' ^ result_list / $',ResultView.as_view(),名称='杜邦&#39),
views.py
class ResultView(generic.UpdateView):
context_object_name = 'dupont_list'
template_name = 'result_list.html'
form_class = InputForm
success_url = '/result/'
def get_queryset(self):
if self.request.method == 'POST': # If this view is target on redirect must have GET data.
form = InputForm(self.request.POST)
if form.is_valid():
if self.request.is_ajax():
company = form.cleaned_data['company']
region = form.cleaned_data['region']
queryset=Result.objects.filter(region=region)
return HttpResponse(simplejson.dumps(to_json), mimetype='application/json')
else:
print form.errors
return super(ResultView,self).get_queryset()
def get_context_data(self, **kwargs):
context = super(ResultView, self).get_context_data(**kwargs)
context["sales"] = self.get_queryset().aggregate(Sum('sales'))
context["employee"] = self.get_queryset().aggregate(Sum('employee'))
HTML
<form id="InputForm" method="post" action=""> #here is the data entry form
{% csrf_token %}
<!--enter the company name-->
<div class="field">
{{ form.company.errors }}
<label id="id_company" name="company" for="{{ form.company.id_for_label }}">Company:</label>
{{ form.company }}
</div>
<!--select region-->
<div class="field" >
<label> Select the Region:
{{ form.region }}
{% for region in form.region.choices %}
<option value="region" name= "region" id="id_region">{{region}} </option>
{% endfor %}
</label>
</div>
<!--submit-->
<p><input type="button" value="Submit" /></p></div>
</form>
</div>
<script src="http://apps.bdimg.com/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<script src="http://malsup.github.com/jquery.form.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#InputForm").submit(function() { // catch the form's submit event
var region= $("#id_region").val();
var company= $("#id_company").val();
$.ajax({ // create an AJAX call...
data: $(this).serialize(), // get the form data
type: $(this).attr('post'),
url: "dupont_list/",
success: function(data) { // on success..
$("#result").html(data); // update the DIV "result"
---how to update the html with filtered result---?
}
});
return false;
});
});
</script>
<div id="result" class="result"> <!--Showing the filtered result in database-->
<table>
<tr><b>Sales</b></tr>
<td> {{sales.sales__sum}}</td>
<tr><b>Employee</b></tr>
<td> {{employee.employee__sum}}</td>
</table>
回溯
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\edit.py" in get
267. self.object = self.get_object()
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\detail.py" in get_object
32. queryset = self.get_queryset()
File "C:\Users\user\Desktop\SCOR\dupont\views.py" in get_queryset
46. return super(ResultView,self).get_queryset()
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\detail.py" in get_queryset
74. 'cls': self.__class__.__name__
Exception Type: ImproperlyConfigured at /result_list/
Exception Value: ResultView is missing a QuerySet. Define ResultView.model, ResultView.queryset, or override ResultView.get_queryset().
根据Anush的建议更新了Views.py
class ResultView(ListView):
context_object_name = 'result_list'
template_name = 'result_list.html'
form_class = InputForm
def post(self, request, *args, **kwargs):
form = InputForm(request.POST)
if form.is_valid():
if self.request.is_ajax():
company = form.cleaned_data['company']
region = form.cleaned_data['region']
queryset=Result.objects.filter(region=region)
sales = self.get_queryset().aggregate(Sum('sales'))
return
data = serializers.serialize('json', queryset,sales)
HttpResponse(data)
else:
return HttpResponse(form.errors)
def get_queryset(self):
return Result.objects.all()
def get_context_data(self, **kwargs):
context = super(ResultView, self).get_context_data(**kwargs)
context["sales"] = self.get_queryset().aggregate(Sum('sales'))
答案 0 :(得分:1)
在views.py中 - &gt; ResultView覆盖了get_queryset()函数,该函数应该返回一个查询集。
所以改变你的get_queryset,如:
def get_queryset(self):
return Result.objects.all()
并单独处理您的帖子,如:
from django.core import serializers
def post(self, request, *args, **kwargs):
form = InputForm(request.POST)
if form.is_valid():
if self.request.is_ajax():
company = form.cleaned_data['company']
region = form.cleaned_data['region']
queryset=Result.objects.filter(region=region).aggregate(Sum('sales'))
return HttpResponse(json.dumps(queryset))
else:
return HttpResponse(form.errors)
你的ajax电话:
$.ajax({
data: $(this).serialize(), // get the form data
type: $(this).attr('post'),
dataType: 'json',
url: "dupont_list/",
success: function(data) {
var html = "<table>"
html += "<td>"+data['sales__sum']+"</td>"
html += "</table>"
$("#result").html(html);
}
});