ima*_*_tn 7 python forms django ajax jquery
在Django管理界面中,有很好的能力动态地将新项目添加到外键字段,我想使用bootstrap模式为弹出窗口和Ajax进行表单提交和验证.
这是我的用例:
这是添加Item的主窗体.物品有一个参考和一个类别.

这是添加新类别的第二种形式.

我没有问题显示模态和提交表单添加新类别.相反,问题在于表单验证(如果用户提交空表单),并刷新选择内容以添加新添加的类别.
这是我的代码:
class ItemForm(forms.ModelForm):
ref = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}),max_length=255)
category = forms.ModelChoiceField(queryset=ItemCategory.objects.all(), empty_label="(choose from the list)")
class ItemCategoryForm(forms.ModelForm):
category = forms.CharField(
max_length=255,
required=True,
help_text='Add a new category')
Run Code Online (Sandbox Code Playgroud)
def add(request):
if request.method == 'POST':
form = ItemForm(request.POST)
if form.is_valid():
item= Item()
item.ref = form.cleaned_data.get('ref')
item.save()
return redirect('/item_list/')
else:
form = ItemForm()
form1 = ItemCategoryForm()
return render(request, 'item/add.html', {'form': form, 'form1':form1})
def add_category(request):
if request.method == 'POST':
form1 = ItemCategoryForm(request.POST)
if form1.is_valid():
vulnCategory = ItemCategory()
ItemCategory.category = form1.cleaned_data.get('category')
ItemCategory.save()
if request.is_ajax():
#TODO: What Should I redirect
else:
#TODO: What Should I redirect
else:
#TODO: What Sould I do to return errors without reloding the page and to refresh the list of categories
Run Code Online (Sandbox Code Playgroud)
url(r'^add/$', 'add', name='add'),
url(r'^add_category/$', 'add_category', name='add_category'),
Run Code Online (Sandbox Code Playgroud)
我还添加了这个jQuery函数来加载结果
$(".add").click(function () {
$.ajax({
url: '/items/add_category/',
data: $("form").serialize(),
cache: false,
type: 'post',
beforeSend: function () {
$("#add_category .modal-body").html("<div style='text-align: center; padding-top: 1em'><img src='/static/img/loading.gif'></div>");
},
success: function (data) {
$("#add_category .modal-body").html(data);
}
});
});
Run Code Online (Sandbox Code Playgroud)
PS:我知道它可能是重复的,但没有答案让我明白了.
在我为内联添加项目的相关类别的解决方案下面.
使用相同的表单,网址作为问题并添加
@login_required
def add_category(request):
data = {}
if request.method == 'POST' :
form = ItemCategoryForm(request.POST)
if form.is_valid():
itemCategory= ItemCategory()
itemCategory.name = form.cleaned_data.get('name')
itemCategory.save()
data['new_itemcategory_value'] = itemCategory.name;
data['new_itemcategory_key'] = itemCategory.pk;
data['stat'] = "ok";
return HttpResponse(json.dumps(data), mimetype="application/json")
else:
data['stat'] = "error";
return render(request, 'item/add_category_modal.html', {'form': form})
else:
form = ItemCategoryForm()
return render(request, 'item/add_category_modal.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)
我的解决方案的棘手部分是在两个不同的html文件中分离模态和man形式,并使用jQuery处理添加和选择新项目.
这个Js代码必须包含在两个html文件中:
// This function is for showing the modal
$(function () {
$(".add_category_show_button").click(function () {
$.ajax({
type: 'GET',
url: '/item/add_category/',
data: $("form").serialize(),
cache: false,
success: function (data, status) {
$('#add_category_modal_id').html(data);
$('#add_category_modal_id').modal()
}
});
}); });
// This second function is for submitting the form inside the modal and handling validation
$(function () {
$(".add_category_submit_button").click(function () {
$.ajax({
type: 'POST',
url: '/item/add_category/',
data: $("form").serialize(),
cache: false,
success: function (data, status) {
if (data['stat'] == "ok") {
$('#add_category_modal_id').modal('hide');
$('#add_category_modal_id').children().remove();
$('#id_category')
.append($("<option></option>")
.attr("value", data['new_itemcategory_key'])
.text(data['new_itemcategory_value']))
.val(data['new_itemcategory_key']);
}
else {
$('#add_category_modal_id').html(data);
$('#add_category_modal_id').modal('show');
}
}
});
}); });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11163 次 |
| 最近记录: |