簡體   English   中英

每當在 Django 中有可供選擇的選項時,如何要求依賴下拉列表?

[英]How to require dependent drop down whenever there are options to choose from in Django?

我有一個帶有相關下拉列表的表單。 目前,我已將其設置為僅在有可用選項時才會顯示第二個下拉列表,否則將隱藏。 我遇到的問題是,每當您選擇具有次要(站)下拉列表的主要(工作區)選項時,您都可以提交表單,而無需從依賴(次要)下拉列表中選擇選項,只要有選項,就應該需要它。

我如何修改它以便在出現時需要依賴下拉菜單?

模型.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)

表格.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')

視圖.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})

網址.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")

但是,在調試器上運行時,我看到了這一點,但表單沒有引發任何錯誤。 有什么我沒有抓住的嗎?

在此處輸入圖片說明

WorkArea 不是字符串。 您應該與屬性name進行比較。

def clean(self):
    cleaned_data = super().clean()
    work_area = cleaned_data['work_area']
    station = cleaned_data['station_number']

    if work_area.name == 'Box Assembly' and station is None:
            raise forms.ValidationError("You must select a station")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM