Как правильно сделать зависимые фильтры?

Основной вопрос в том как используя 2 зависимых друг от друга ниспадающих фильтра, при этом получив результат в виде того же списка при его выборе передать в CreateView.

Проще говоря: Выбрав город из ниспадающего списка, получить список групп в выбранном городе. Далее выбрав группу - получить список Фамилий и взяв выбранную фамилию сделать запись в таблице добрав остальные данные, так же при этом присвоив в поле members пользователя который это сделал.

В models.py:
class Group(models.Model):

    group = models.CharField('Группа', max_length=5, unique=True)

    def __str__(self):
        return self.group



class Cities(models.Model):
    
    city = models.CharField('Город', max_length=255, unique=True)

    
    def __str__(self):
        return self.city


class Numbers(models.Model):
   

    FIO = models.CharField('ФИО', max_length=255)
    GROUP = models.ForeignKey(Group, on_delete=models.PROTECT, verbose_name='Группа')
    CITY = models.ForeignKey(Cities, on_delete=models.PROTECT, verbose_name='Город')
    DATE_ADD = models.DateTimeField('Дата добавления', auto_now_add=True)
    DATE_DELETE = models.DateTimeField('Дата удаления', blank=True, null=True)
    DATE_UPDATE = models.DateTimeField('Дата обновления', auto_now=True, null=True)
    MEMBERS = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Логин изменившего')

    
    def __str__(self):
        return self.FIO


class Clear(models.Model):
   
    chas = [
        ('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'),
        ('4', '4'), ('5', '5'), ('6', '6'),
        ('7', '7'), ('8', '8'), ('9', '9'),
        ('10', '10'), ('11', '11'), ('12', '12'),
        ('13', '13'), ('14', '14'), ('15', '15'),
        ('16', '16'), ('17', '17'), ('18', '18'),
        ('19', '19'), ('20', '20'), ('21', '21'),
        ('22', '22'), ('23', '23')
    ]

    FIO = models.ForeignKey(Numbers, verbose_name='ФИО', on_delete=models.PROTECT)
    DATE_CLEAR = models.DateField('Дата чистки')
    HOUR_FROM = models.CharField('с', max_length=2, choices=chas)
    HOUR_TO = models.CharField('по', max_length=2, choices=chas)
    COMMENT = models.CharField('Комментарий', max_length=255, null=True, blank=True)
    DATE_ADD = models.DateTimeField('Дата добавления', auto_now_add=True)
    DATE_DELETE = models.DateTimeField('Дата удаления', blank=True, null=True)
    DATE_UPDATE = models.DateTimeField('Дата обновления', auto_now=True, null=True)
    MEMBERS = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Логин изменившего')

В views.py:
class AddClear(PermissionRequiredMixin, CreateView):
    permission_required = 'clear.add_clear'
    model = Clear
    template_name = 'clear/add_clear.html'
    form_class = ClearForm
    success_url = reverse_lazy('clear')
    extra_context = {'title': 'Добавить в чистку'}

в forms.py:
class ClearForm(forms.ModelForm):
    class Meta:
        model = Clear
        fields = ['FIO', 'DATE_CLEAR', 'HOUR_FROM', 'HOUR_TO', 'COMMENT',]

    def clean(self):
        hour_from = self.cleaned_data['HOUR_FROM']
        hour_to = self.cleaned_data['HOUR_TO']
        if hour_from > hour_to:
            raise ValidationError('"Время C" должно быть меньше')
        return self.cleaned_data

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs['class'] = 'form-control'

в urls.py:
path('add_clear/', views.AddLine2Clear.as_view(), name='add_clear')

в HTML:
{% extends 'base.html' %}

{% block title %}{{ title }}{% endblock %}
<h1 class="mt-3">{{ title }}</h1>

<div class="col-3 ml-4">

<form class="mt-4" action="{% url 'add_clear' %}" method = 'post'>
    {% csrf_token %}

{{ form }}

        <button type="submit" class="btn btn-danger btn-block mt-2">Добавить запись</button>


</form>
</div>
{% endblock %}

Понимаю, что это нужно делать на стороне клиента используя AJAX, или что то подобное. Но в ajax я полный 0, да и в django не далеко ушел. Буду благодарен хотя бы на похожий пример реализации.
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Либо через несколько шагов формы, с помощью перезагрузки страницы, либо (раз ajax==0) с помощью библиотек, которые это умеют, например, django-autocompletelight.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы