Django - 以模式显示表单
Django - Diplay a form in a modal
我正在构建一个 Django 应用程序,我尝试以模式 window 显示我的一个表单。它最初是为一个普通的开发的,脚本运行良好,但我无法正确实现模态。
上下文是经典的:window 显示一个对象列表,其中每个对象都有一个用于编辑它的按钮,以及一个用于创建新对象的附加全局按钮。每个按钮都应该打开相同的模式。
如果我没有几个专门用于表单的 js 脚本,它可能会变得很容易,因为它们是我的问题:现在表单处于模态状态时不能正常工作。所以我做错了什么,最后我什至不确定我的方法是最好的。
第一个问题:在我的搜索中,一个想法可能是 js 脚本不会应用于 html 之后更新的部分:是真的吗?在这种情况下,有没有办法制作一种 'reload' 让 js 理解它的范围已经改变?
使用bootstrap显示模态,HTML代码如下:
<div id="grp_detail" class="modal fade hide" role="dialog" tabindex='-1'>
<div class="modal-dialog modal-lg">
<div class="modal-content form_content">
{% include './adm_group_detail.html' %}
</div>
</div>
</div>
如果您需要包含的模板,请告诉我 - 它很大,因为表单有点棘手。
显示列表页面的视图如下:
@user_passes_test(lambda u: u.is_superuser or (u.id is not None and u.usercomp.is_admin))
def adm_groups(request, comp_slug):
'''
Manage users groups
'''
# Variables set to be integrated in locals()
company = Company.get_company(comp_slug)
group_list = UserGroup.objects.filter(company__comp_slug=comp_slug, hidden=False).order_by('group_name')
# Initialize an empty form to create a new group (to be displayed in a modal)
group_form = GroupDetail()
group_form.fields['all_users'].queryset = UserComp.objects.\
filter(company=company).\
order_by('user__last_name', 'user__first_name')
return render(request, "polls/adm_groups.html", locals())
如您所见,我在这个阶段生成了一个空表单,以便在用户打算创建新项目时简化显示。
在这种情况下,模态可以完美地工作。不幸的是,如果我之前编辑过另一个项目,我需要使用脚本来刷新表单;并且,在这种情况下,如您所见,它不起作用。
为了填充表单以编辑对象,通过 js 脚本收集数据:
生成表单的脚本如下:
$('.update-grp').click(function(e) {
$.ajax({
method: 'GET',
url: $(this).attr('url-endpoint'),
data: {
comp_slug: $(this).attr('comp-slug'),
grp_id: $(this).attr('grp-id')
},
success: handleSuccess,
error: handleError,
});
function handleSuccess(data) {
$(".form_content").html(data.group_form);
};
function handleError(error_data) {
console.log("error");
console.log(error_data);
};
})
它调用以下视图:
def get_group_detail(request):
""" Gather and send information related to groups """
comp_slug = request.GET["comp_slug"]
grp_id = int(request.GET["grp_id"]) # comes as string when 0
company = Company.get_company(comp_slug)
if grp_id > 0:
current_group = UserGroup.objects.get(id=grp_id)
group_form = GroupDetail(instance=current_group)
else:
group_form = GroupDetail()
group_form.fields['all_users'].queryset = UserComp.objects.\
filter(company=company).\
order_by('user__last_name', 'user__first_name')
context = {
"comp_slug": comp_slug,
"company": company,
"grp_id": grp_id,
"group_form": group_form,
}
template = render_to_string('polls/adm_group_detail.html', context=context, request=request)
return JsonResponse({"group_form": template})
模态显示正确,但与表单相关的脚本根本没有启动(即使是console.log('Hello')
也不显示任何东西)。
在我的尝试中,其中之一不仅是生成整个模板,专门用于表单的模板,但结果更糟。
仅供参考,我不知道它是否有帮助,这是带有数据的模态视图:
蓝色按钮用于将元素从一个列表移动到另一个列表,这也可以通过双击来实现。但是在模态中什么也没有发生。
我最近认为是正确的:脚本不适用于更新的 html 代码。要更改此设置,我需要将处理程序附加到不会更改的父对象,然后 'delegate' 附加到应该触发操作的实际对象。
因此,我需要更改模式中按钮的触发方式并替换它,其中处理程序位于按钮本身:
$("#add_selected").on("click", function(e) {
这样,处理程序包含模式,并将事件委托给按钮:
$(".form_content").on("click", '#add_selected', function(e) {
我正在构建一个 Django 应用程序,我尝试以模式 window 显示我的一个表单。它最初是为一个普通的开发的,脚本运行良好,但我无法正确实现模态。
上下文是经典的:window 显示一个对象列表,其中每个对象都有一个用于编辑它的按钮,以及一个用于创建新对象的附加全局按钮。每个按钮都应该打开相同的模式。
如果我没有几个专门用于表单的 js 脚本,它可能会变得很容易,因为它们是我的问题:现在表单处于模态状态时不能正常工作。所以我做错了什么,最后我什至不确定我的方法是最好的。
第一个问题:在我的搜索中,一个想法可能是 js 脚本不会应用于 html 之后更新的部分:是真的吗?在这种情况下,有没有办法制作一种 'reload' 让 js 理解它的范围已经改变?
使用bootstrap显示模态,HTML代码如下:
<div id="grp_detail" class="modal fade hide" role="dialog" tabindex='-1'>
<div class="modal-dialog modal-lg">
<div class="modal-content form_content">
{% include './adm_group_detail.html' %}
</div>
</div>
</div>
如果您需要包含的模板,请告诉我 - 它很大,因为表单有点棘手。
显示列表页面的视图如下:
@user_passes_test(lambda u: u.is_superuser or (u.id is not None and u.usercomp.is_admin))
def adm_groups(request, comp_slug):
'''
Manage users groups
'''
# Variables set to be integrated in locals()
company = Company.get_company(comp_slug)
group_list = UserGroup.objects.filter(company__comp_slug=comp_slug, hidden=False).order_by('group_name')
# Initialize an empty form to create a new group (to be displayed in a modal)
group_form = GroupDetail()
group_form.fields['all_users'].queryset = UserComp.objects.\
filter(company=company).\
order_by('user__last_name', 'user__first_name')
return render(request, "polls/adm_groups.html", locals())
如您所见,我在这个阶段生成了一个空表单,以便在用户打算创建新项目时简化显示。
在这种情况下,模态可以完美地工作。不幸的是,如果我之前编辑过另一个项目,我需要使用脚本来刷新表单;并且,在这种情况下,如您所见,它不起作用。
为了填充表单以编辑对象,通过 js 脚本收集数据: 生成表单的脚本如下:
$('.update-grp').click(function(e) {
$.ajax({
method: 'GET',
url: $(this).attr('url-endpoint'),
data: {
comp_slug: $(this).attr('comp-slug'),
grp_id: $(this).attr('grp-id')
},
success: handleSuccess,
error: handleError,
});
function handleSuccess(data) {
$(".form_content").html(data.group_form);
};
function handleError(error_data) {
console.log("error");
console.log(error_data);
};
})
它调用以下视图:
def get_group_detail(request):
""" Gather and send information related to groups """
comp_slug = request.GET["comp_slug"]
grp_id = int(request.GET["grp_id"]) # comes as string when 0
company = Company.get_company(comp_slug)
if grp_id > 0:
current_group = UserGroup.objects.get(id=grp_id)
group_form = GroupDetail(instance=current_group)
else:
group_form = GroupDetail()
group_form.fields['all_users'].queryset = UserComp.objects.\
filter(company=company).\
order_by('user__last_name', 'user__first_name')
context = {
"comp_slug": comp_slug,
"company": company,
"grp_id": grp_id,
"group_form": group_form,
}
template = render_to_string('polls/adm_group_detail.html', context=context, request=request)
return JsonResponse({"group_form": template})
模态显示正确,但与表单相关的脚本根本没有启动(即使是console.log('Hello')
也不显示任何东西)。
在我的尝试中,其中之一不仅是生成整个模板,专门用于表单的模板,但结果更糟。
仅供参考,我不知道它是否有帮助,这是带有数据的模态视图:
蓝色按钮用于将元素从一个列表移动到另一个列表,这也可以通过双击来实现。但是在模态中什么也没有发生。
我最近认为是正确的:脚本不适用于更新的 html 代码。要更改此设置,我需要将处理程序附加到不会更改的父对象,然后 'delegate' 附加到应该触发操作的实际对象。
因此,我需要更改模式中按钮的触发方式并替换它,其中处理程序位于按钮本身:
$("#add_selected").on("click", function(e) {
这样,处理程序包含模式,并将事件委托给按钮:
$(".form_content").on("click", '#add_selected', function(e) {