【发布时间】:2014-09-15 22:34:24
【问题描述】:
在 Django 管理界面中,有一个很好的功能,可以动态地将新项目添加到外键字段,我想使用 bootstrap modal 弹出窗口和 Ajax 表单提交和验证来做一个类似的。
这是我的用例:
这是添加项目的主窗体。项目有一个参考和一个类别。
这是添加新类别的第二种形式。
我在显示模式和提交表单以添加新类别方面没有问题。 相反,问题在于表单验证(以防用户提交空表单),以及刷新选择内容以添加新添加的类别。
这是我的代码:
forms.py
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')
views.py
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
urls.py
url(r'^add/$', 'add', name='add'),
url(r'^add_category/$', 'add_category', name='add_category'),
我还添加了这个 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);
}
});
});
PS:我知道它可能是重复的,但没有一个答案让我明白这一点。
【问题讨论】:
-
你总是可以实现 django admin 使用的类似方法,它实际上像你一样加载视图(例如添加一个类别)通过标记 is_popup 呈现模板,这反过来又删除了不需要加载的部分(侧边栏、标题等)。如果您以相同的方式实现(这并不难),那么您可以提交表单并由通常的 django 流程处理所有事情(表单验证、保存模型等)。
-
Django Admin 界面打开一个单独的弹出窗口,我想在同一页面中显示弹出窗口并在不刷新页面的情况下发送数据,以防止键入的数据丢失。
-
你可以修改它来生成一个modal而不是一个popup(modal其实就是一个popup...)。弹出窗口不会刷新页面也不会重定向您,它只会在您插入新条目时更新相关字段。
标签: jquery python ajax django forms