django ajax表示如何在提交后显示结果

时间:2015-10-22 10:35:26

标签: jquery python ajax django

我确信这不是一个复杂的问题,但我已经在这里停留了很长时间,希望得到你们的帮助,非常感谢任何帮助。谢谢!!!!

我认为需要使用"追加"来自ajax的功能。但我真的不确定如何编写正确的views.py和脚本。请在下面看我的片段,并给我你宝贵的更正。

我当前的代码返回错误" ResultView缺少QuerySet。"

enter image description here

图片不言自明。用户输入信息,然后单击“提交”,然后根据这些信息过滤数据库。最后在同一页面显示结果。

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'))

1 个答案:

答案 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);
    }
});
相关问题