Django AJAX异步调用一个网址

时间:2015-04-30 08:05:22

标签: jquery python ajax django forms

我对Django中的表单提交有疑问。有两种形式,每种形式都有自己的数字插入数据库中。

  1. Form1:必须插入值1
  2. Form2:必须插入值2
  3. 这两个表单都在网址/kategorije/上。当我提交form1时,form1插入到值为1的数据库中,这没关系。但是当我提交form2,form2插入值1.这是问题,我想用form2在数据库中插入值2。 我的代码如下:

    models.py

    class CategoryType(models.Model):
        id   = models.AutoField(primary_key=True)
        type = models.CharField(max_length=255)
    
        def __str__(self):
            return self.type
    
    class Category(models.Model):
        id = models.AutoField(primary_key=True)
        type_id = models.ForeignKey('CategoryType')
        name = models.CharField(max_length=255)
    
        def __str__(self):
            return str(self.name)
    

    forms.py

    class NewCategory(forms.ModelForm):
        name = forms.RegexField(regex=r'\w+', label=_('Naziv kategorije'),
                                widget=forms.TextInput(
                                    {'class': 'form-control ', 'placeholder': 'Naziv kategorije', 'id': 'kategorija'}))
    
        class Meta:
            model = Category
            fields = ('name',)
            exclude = ('type_id', )
    
    
    
    class NewServiceIn(forms.ModelForm):
        name = forms.RegexField(regex=r'\w+', label=_('Naziv kategorije'),
                                widget=forms.TextInput(
                                    {'class': 'form-control ', 'placeholder': 'Naziv kategorije', 'id': 'kategorija'}))
    
        class Meta:
            model = Category
            fields = ('name',)
            exclude = ('type_id', )
    

    views.py

    @login_required
    @csrf_protect
    @csrf_exempt
    
    
    def CategoryNew(request):
        template = 'category.html'
        user_pk = request.user.id
        org_name = OrganizationInfo.objects.filter(id=user_pk).values('name')[0]
    
        error = ''
        success = False
    
        # Forms
        if request.is_ajax():
            form1 = NewCategory(request.POST or None)
    
            if form1.is_valid():
                a = form1.save(commit=False)
                name = form1.cleaned_data['name']
    
                if Category.objects.filter(name__exact=name).exists():
                    error = Category.objects.filter(name__exact=name).values('name')[0]
                else:
                    a.type_id = CategoryType.objects.get(type='products')
                    a.save(name)
                    success = name
            ajax_vars = {'success': success, 'error': error}
            return HttpResponse(json.dumps(ajax_vars))
    
        else:
            form1 = NewCategory()
    
        if request.is_ajax():
            form2 = NewServiceIn(request.POST or None)
            if form2.is_valid():
                b = form2.save(commit=False)
                name1 = form2.cleaned_data['name1']
    
                if Category.objects.filter(name__exact=name1).exists():
                    error = Category.objects.filter(name__exact=name1).values('name')[0]
                else:
                    b.type_id = CategoryType.objects.get(type='services')
                    b.save(name1)
                    success = name1
    
            ajax_vars = {'success': success, 'error': error}
            return HttpResponse(json.dumps(ajax_vars))
    
        else:
            form2 = NewServiceIn()
    
        return render_to_response(template, dict(name=org_name, form1=form1, form2=form2),
                                  context_instance=RequestContext(request))
    

    ajax.js

    /*Service*/
    $('#service1').on('submit', function(){
        var $form = $(this);
        $.ajax({
            type: "POST",
            url: "/kategorije/",
            data: $form.serialize(),
            dataType: "json",
            required: true,
            success: function(response) {
    
                if (!response.success) {
                    console.log(response.error.name);
                   $.niftyNoty({
                    type: 'info',
                    container : '#alertajme_ser',
                    html : '<h4 class="alert-title">Kategorija sa nazivom <strong>'+response.error.name+'</strong> već postoji!</h4><p class="alert-message">Promjenite naziv kategorije.</p><div class="mar-top"><button type="button" class="btn btn-info" data-dismiss="noty">Zatvorite notifikaciju</button></div>',
                    closeBtn : false,
                    timer : 5000
                });
                } else {
                    $.niftyNoty({
                    type: 'info',
                    container : '#alertajme_ser',
                    html : '<h4 class="alert-title">Kategorija sa nazivom <strong>'+response.success+'</strong> uspješno je kreirana!</h4><div class="mar-top"><button type="button" class="btn btn-info" data-dismiss="noty">Zatvorite notifikaciju</button></div>',
                    closeBtn : false,
                    timer : 5000
                });
    
                }
            },
            error: function(rs, e) {
               $.niftyNoty({
                    type: 'info',
                    container : '#alertajme_ser',
                    html : '<h4 class="alert-title">Kategorija sa nazivom <strong>'+rs.responseText+"konj"+'</strong> već postoji!</h4><p class="alert-message">Promjenite naziv kategorije.</p><div class="mar-top"><button type="button" class="btn btn-info" data-dismiss="noty">Zatvorite notifikaciju</button></div>',
                    closeBtn : false,
                    timer : 5000
                });
                return false;
            }
        });
        return false;
    });
    

    第二个Ajax服务是相同的,但表单ID是不同的。

    template.html

    <form id ="service1" action="" method="post">
    <div class="modal fade" id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title modial_header" id="myModalLabel">Dodavanje kategorije usluga</h4>
            <div id ="alertajme_ser" class="panel-alert"></div>
          </div>
          <div class="modal-body">
            <div class="col-xs-12" style="padding-top:10px;">
                  {% csrf_token %}
                <div class="form-group">
                    <label class="control-label">Naziv usluge<span class="example1">*</span></label>
                    {{ form2.name }}
                </div>
            </div>
          </div>
          <div class="modal-footer bottom_modial">
               <button type="submit" class="btn btn_modial_main">SPREMI KATEGORIJU</button>
          </div>
    
        </div>
      </div>
    </div>
    </form>
    

    如果你能就这个问题给我一些建议。也许我在forms.py上的语句中做错了。但不知道如何使这项工作。

2 个答案:

答案 0 :(得分:0)

在views.py中

 if request.is_ajax():
        form1 = NewCategory(request.POST or None)

        if form1.is_valid():
            a = form1.save(commit=False)
            name = form1.cleaned_data['name']

            if Category.objects.filter(name__exact=name).exists():
                error = Category.objects.filter(name__exact=name).values('name')[0]
            else:
                a.type_id = CategoryType.objects.get(type='products')
                a.save(name)
                success = name
        ajax_vars = {'success': success, 'error': error}
        return HttpResponse(json.dumps(ajax_vars))
如果request是ajax,

将始终返回,即使它应该是form2。我认为您打算将最后两行列表另外一次,因此只有在form1有效时才会提交它们。

答案 1 :(得分:0)

你没有做任何事情告诉Django这些表格是分开的。它们都只有一个name字段;什么都没有告诉他们。

对此的一个简单解决方案是将prefix参数用于表单实例化,以便Django使字段唯一。

if request.is_ajax():
    form1 = NewCategory(request.POST or None, prefix='form1')
    if form1.is_valid():
        ...
else:
    form1 = NewCategory(prefix='form1')

if request.is_ajax():
    form2 = NewServiceIn(request.POST or None, prefix='form2')
    if form2.is_valid():
        ...
else:
    form2 = NewServiceIn(prefix='form2')