当前位置: 代码迷 >> python >> django ajax表单提交后如何显示结果
  详细解决方案

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

热度:118   发布时间:2023-06-13 16:52:54.0

我相信这不是一个复杂的问题,但是我已经在这里住了很长时间了,希望对您有所帮助,非常感谢您的帮助。谢谢!!!!

我认为需要使用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)

表格

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(),name ='dupont'),

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

在views.py-> 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);
    }
});
  相关解决方案