В Django Как настроить зависимые выпадающие списки

#django

Вопрос:

Я пытаюсь настроить зависимые выпадающие списки на сайте Django 3.1. Списки заполняются с помощью таблиц базы данных другого приложения (Django-Machina). Я попытался адаптировать приведенный здесь пример. Однако я новичок в Django и Python и до сих пор не могу заставить это работать.

Мои файлы выглядят следующим образом:

models.py

 from django.contrib.auth.models import AbstractUser
from django.db import models
from machina.core.db.models import get_model
from django.db.models import Q

Forum = get_model("forum", "Forum")

class CustomUser(AbstractUser):
    age = models.PositiveIntegerField(null=True, blank=True)
    business_location_state = models.ForeignKey(Forum, null=True,  on_delete=models.SET_NULL, limit_choices_to={"lft":1})
    business_location_county = models.ForeignKey(Forum, null=True, on_delete=models.SET_NULL, related_name='county', limit_choices_to=(~Q(lft__in = (1,2))))
 

views.py

 from django.urls import reverse_lazy
from django.views.generic import CreateView
from .forms import CustomUserCreationForm
from .models import CustomUser
from django.shortcuts import render
from machina.core.db.models import get_model
from django.db.models import Q

Forum = get_model("forum", "Forum")


class SignUpView(CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'registration/signup.html'

def load_counties(request):
    parent_id = request.GET.get('business_location_state')
    counties = Forum.objects.filter(parent_id=parent_id).order_by('name')
    return render(request, 'hr/county_dropdown_list_options.html', {'counties': counties})
 

accounts/urls.py

 # accounts/urls.py
from django.urls import path
from .views import SignUpView
from . import views

urlpatterns = [
    path('signup/', SignUpView.as_view(), name='signup'),
    path('ajax/load-counties/', views.load_counties, name='ajax_load_counties'),  # ajax to load counties

]
 

forms.py

 from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = CustomUser
        fields = UserCreationForm.Meta.fields   ('username', 'email', 'age', 'business_location_state', 'business_location_county')

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




class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'age','business_location_state', 'business_location_county')
 

count_dropdown_list_options.html

 <!-- templates/hr/county_dropdown_list_options.html -->
<option value="">---------</option>
{% for county in counties %}
<option value="{{ business_location_county.pk }}">{{ business_location_county.name }}</option>
{% endfor %}
 

signup.html

 <!-- templates/registration/signup.html -->
{% extends 'base.html' %}

{% block title %}
  Sign Up
{% endblock title %}

{% block content %}
<h2>Sign up</h2>
<form method="post" id=signupForm data-counties-url="{% url 'ajax_load_counties' %}" novalidate>
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Sign Up</button>
</form>

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script>
    $("#id_business_location_state").change(function () {
      var url = $("#signupForm").attr("data-counties-url");  // get the url of the `load_cities` view
      var stateId = $(this).val();  // get the selected country ID from the HTML input

      $.ajax({                       // initialize an AJAX request
        url: url,                    // set the url of the request (= localhost:8000/hr/ajax/load-cities/)
        data: {
          'business_location_state': stateId       // add the state id to the GET parameters
        },
        success: function (data) {   // `data` is the return of the `load_cities` view function
          $("#id_county").html(data);  // replace the contents of the city input with the data that came from the server
        }
      });

    });
  </script>
{% endblock content %}
 

В настоящее время я не вижу никаких ошибок, но список округов не меняется в зависимости от выбора «Штат расположения предприятия». Есть какие-нибудь идеи о том, что происходит не так?

Комментарии:

1. Является ли идентификатор вашего поля id_county ? Я бы предположил, что его идентификатору будет id_business_location_county присвоено имя поля. Вы можете проверить отображаемый HTML-код с помощью инструментов разработчика браузеров, проверить идентификатор поля. Из того, что я понимаю, вам нужно было бы изменить $("#id_county").html(data); $("#id_business_location_county").html(data); . Также в вашем шаблоне для ajax вы пишете {{ business_location_county.pk }} и {{ business_location_county.name }} , но ваша переменная цикла называется county

2. Спасибо тебе, Абдул. Это сделало свое дело. Я изменил $(«#id_county»).html(данные); на $(«#id_business_location_county»).html(данные); а затем пролистал {{ county.pk }} и {{ county.name }} в ajax.