我对Django中的表单提交有疑问。有两种形式,每种形式都有自己的数字插入数据库中。
这两个表单都在网址/kategorije/
上。当我提交form1时,form1插入到值为1的数据库中,这没关系。但是当我提交form2,form2插入值1.这是问题,我想用form2在数据库中插入值2。
我的代码如下:
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)
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', )
@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))
/*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是不同的。
<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">×</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上的语句中做错了。但不知道如何使这项工作。
答案 0 :(得分:0)
,
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')