gpt4 book ai didi

javascript - 如何在页面加载时 "load"依赖下拉?

转载 作者:行者123 更新时间:2023-12-04 04:28:05 26 4
gpt4 key购买 nike

我有一个带有依赖下拉列表的表单。只要所选的主要选项没有任何辅助选项,并且页面首次加载时,此辅助下拉菜单就会隐藏。每当提交表单时,只有第一个字段被清除,因为大多数时候下拉菜单保持不变,但是,只要主下拉菜单发生变化,脚本就会工作,因为加载确实不构成更改,它只是将选择/提交的选项保留在主要下拉列表中,并且只会显示一个空的辅助下拉列表,即使选择的主要选项确实有辅助选项。我从教程的下拉列表中获得了大部分 JS,因为我对它不是很熟悉。为了更直观的理解:

这是页面首次加载时的表单

enter image description here

当您选择具有辅助选项的选项时,会出现另一个下拉列表

enter image description here

选择一个Station并提交后,Employee#被清除,但其他两个应该保留,但是,当页面在提交时重新加载时,它看起来像这样,并且根据调试器已经清除了station,因为没有技术上。我不太关心车站清理,但更关心的是没有一个不应该为空的空下拉菜单。

enter image description here

当我查看表单中保留的数据时,只有工作区保留,因为在您从下拉列表中选择另一个选项之前,依赖下拉列表不会加载,并且如果您希望能够再次看到 Box Assembly 选项,您必须单击另一个选项,然后返回到 Box Assembly(例如)

我该如何解决这个问题?有没有办法强制javascript首先尝试加载,以便检查剩余的选项是否具有辅助选项,是否已触发?

表格.py

class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
widgets = {
'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
}
fields = ('employee_number', 'work_area', 'station_number')


def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['station_number'].queryset = Station.objects.none()

if 'work_area' in self.data:
try:
work_area_id = int(self.data.get('work_area'))
self.fields['station_number'].queryset = Station.objects.filter(work_area_id=work_area_id).order_by('name')
except (ValueError, TypeError):
pass
elif self.instance.pk:
self.fields['station_number'].queryset = self.instance.work_area.stations.order_by('name')

View .py
def enter_exit_area(request):
enter_without_exit = None
exit_without_enter = None

if request.method == 'POST':
form = WarehouseForm(request.POST)
if form.is_valid():
emp_num = form.cleaned_data['employee_number']
area = form.cleaned_data['work_area']
station = form.cleaned_data['station_number']

# Submission logic
form = WarehouseForm(initial={'employee_number': '', 'work_area': area, 'station_number': station})

else:
form = WarehouseForm()
return render(request, "operations/enter_exit_area.html", {
'form': form,
'enter_without_exit': enter_without_exit,
'exit_without_enter': exit_without_enter,
})

urls.py
urlpatterns = [
url(r'enter-exit-area/$', views.enter_exit_area, name='enter_exit_area'),

path('ajax/load-stations/', views.load_stations, name='ajax_load_stations'),
]

在这个 html 的末尾是处理依赖下拉列表的脚本

enter_exit_area.html
{% extends "operations/base.html" %}
{% block main %}
<form id="warehouseForm" action="" method="POST" data-stations-url="{% url 'operations:ajax_load_stations' %}" novalidate >
{% csrf_token %}

<div>
<div>
<label>Employee #</label>
{{ form.employee_number }}
</div>

<div>
<label>Work Area</label>
{{ form.work_area }}
</div>
<div class="col-xs-8" id="my-hidden-div">
<label>Station</label>
{{ form.station_number }}
</div>
</div>
</form>

<script>
function loadStations() {
var url = $("#warehouseForm").attr("data-stations-url");
var workAreaId = $(this).val();
var $stationNumberField = $("#{{ form.station_number.id_for_label }}");

$.ajax({
url: url,
data: {
'work_area': workAreaId
},
success: function (data) {
$("#my-hidden-div").show(); // show it
$stationNumberField.html(data);
// Check the length of the options child elements of the select
if ($stationNumberField.find("option").length === 1) {
$stationNumberField.parent().hide(); // Hide parent of the select node
} else {
// If any option, ensure the select is shown
$stationNumberField.parent().show();
}
}
});
}
$("#id_work_area").change(loadStations);
$(document).ready(loadStations);
</script>
{% endblock main %}

station_number_dropdown_options.html
<option value="">---------</option>
{% for station in stations %}
<option value="{{ station.pk }}">{{ station.name }}</option>
{% endfor %}

最佳答案

我看到你有 $(document).ready(loadStations); .

但问题是在 loadStations ,你做var workAreaId = $(this).val(); .
this将是 document , 和 $(document).val()是一个空字符串。

loadStations 中硬编码选择器:

// var workAreaId = $(this).val();
var workAreaId = $("#id_work_area").val();

或者改为从元素触发更改:

$("#id_work_area").change(loadStations);
// $(document).ready(loadStations);
$("#id_work_area").change();

关于javascript - 如何在页面加载时 "load"依赖下拉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59183069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com