2015-04-30 36 views
0

我有关于在Django中提交表单的问题。有两种形式,每种形式都有自己的数字插入到数据库中。Django AJAX异步调用一个URL

  1. Form1中:必须插入值1
  2. 窗体2:必须插入值2

这两种形式都在URL /kategorije/。当我提交form1时,form1插入到值为1的数据库中,这没关系。但是当我提交form2时,form2插入值1.t是问题,我想用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的语句中做错了if。但不知道如何使这个作品。

回答

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

谢谢你在这方面的解决方案,它的工作原理! @Daniel Roseman – marin

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

总是返回如果请求是AJAX,即使它被认为是对窗口2。我想你的意思是将最后两行列为额外的时间,所以他们只有在form1有效时才会被提交。

+0

谢谢你的意见,但如何使它的工作。 @julius – marin