【发布时间】:2020-03-29 13:09:56
【问题描述】:
我有一个带有相关下拉列表的表单。目前,我已将其设置为只有在其中有可用选项时才会显示第二个下拉菜单,否则会隐藏。我遇到的问题是,每当您选择具有辅助(站)下拉列表的主要(工作区)选项时,您可以提交表单而无需从依赖(辅助)下拉列表中选择选项,只要有选项,就应该需要它。
我如何修改它,以便在出现时需要依赖下拉菜单?
models.py
class WorkArea(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Station(models.Model):
work_area = models.ForeignKey(WorkArea, on_delete=models.CASCADE, related_name="stations")
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False, help_text="Work Area", related_name="work_area")
station_number = models.ForeignKey(Station, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)
forms.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')
views.py
def enter_exit_area(request):
enter_without_exit = None
exit_without_enter = None
if request.method == 'POST':
# Form handling...
def load_stations(request):
work_area_id = request.GET.get('work_area')
stations = Station.objects.filter(work_area_id=work_area_id).order_by('name')
return render(request, 'operations/station_number_dropdown_options.html', {'stations': stations})
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'),
]
station_number_dropdown_options.html
<option value="">---------</option>
{% for station in stations %}
<option value="{{ station.pk }}">{{ station.name }}</option>
{% endfor %}
我尝试将其添加到 forms.py(Box Assembly 是具有站点的选项之一)
def clean(self):
cleaned_data = super().clean()
work_area = cleaned_data['work_area']
station = cleaned_data['station_number']
if work_area in ('Box Assembly', 'Other) and station is None:
raise forms.ValidationError("You must select a station")
但是,在调试器上运行时,我看到了这一点,但表单并没有引发任何错误。有什么我没听懂的吗?
【问题讨论】: