Jak „załadować” zależne menu rozwijane po załadowaniu strony?


9

Mam formularz z zależnym menu rozwijanym. To dodatkowe menu rozwijane jest ukryte za każdym razem, gdy wybrana podstawowa opcja nie ma żadnych dodatkowych opcji i gdy strona jest ładowana po raz pierwszy. Za każdym razem, gdy formularz jest przesyłany, usuwane jest tylko pierwsze pole, ponieważ przez większość czasu listy rozwijane pozostają takie same, ponieważ skrypt działa zawsze, gdy następuje zmiana w głównym menu rozwijanym, ponieważ obciążenie nie stanowi zmiany, po prostu zachowuje wybraną / przesłaną opcję w głównym menu rozwijanym i wyświetla tylko puste menu rozwijane wtórne, nawet jeśli wybrana opcja główna ma opcje dodatkowe. Większość JS otrzymałem z listy rozwijanej z samouczka, ponieważ nie jestem zbyt dobrze zaznajomiony z tym. Dla lepszego wizualnego zrozumienia:

Jest to formularz przy pierwszym ładowaniu strony

wprowadź opis zdjęcia tutaj

Po wybraniu opcji z opcjami dodatkowymi pojawia się druga lista rozwijana

wprowadź opis zdjęcia tutaj

Po wybraniu stacji i przesłaniu numer pracownika zostaje wyczyszczony, ale pozostałe dwa powinny pozostać, jednak gdy strona zostanie ponownie załadowana po przesłaniu, wygląda to tak, a stacja została wyczyszczona zgodnie z debuggerem, ponieważ nie ma żadnych technicznie. Nie dbam tak bardzo o czyszczenie stacji, ale bardziej o brak pustej listy rozwijanej, która nie powinna być pusta.

wprowadź opis zdjęcia tutaj

A kiedy patrzę na dane, które pozostały w formularzu, pozostał tylko obszar roboczy, ponieważ zależne menu rozwijane nie ładuje się, dopóki nie wybierzesz innej opcji z listy rozwijanej, a jeśli chcesz ponownie zobaczyć opcje złożenia skrzynki , musisz kliknąć inną opcję, a następnie wrócić do zestawu skrzynek (na przykład)

Jak mogę rozwiązać ten problem? Czy istnieje sposób, aby zmusić javascript do próby załadowania w pierwszej kolejności, aby sprawdził, czy pozostała opcja ma opcje dodatkowe, czy została uruchomiona, czy nie?

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 = 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'),
]

Na końcu tego html znajduje się skrypt, który obsługuje zależne menu rozwijane

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 %}

Odpowiedzi:


3

Widzę, że masz $(document).ready(loadStations);.

Ale problem polega na tym loadStations, że tak var workAreaId = $(this).val();.

thisbędzie documenti $(document).val()jest pustym ciągiem.

Wybierz kod na stałe w loadStations:

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

Lub uruchom zamiast tego zmianę elementu:

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

Pierwsza opcja nie działała (nic nie ładowała), ale druga działała, dziękuję!
Przyznam
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.