Как установить queryset в forms.Form(ModelChoiceField) для выпадающего городского списка?

Я установил ForeignKey() для класса Town в файле models. В идеале, когда я выбираю государство, все города, принадлежащие этому государству, будут перечислены в town.

#models.py

class State(models.Model):
    state = models.CharField(max_length=50)
    code = models.CharField(max_length=3)
    def __str__(self):
        return self.state

class Town(models.Model):
    town = models.CharField(max_length=50)
    code = models.CharField(max_length=4)
    state = models.ForeignKey(State, on_delete=models.CASCADE)
    def __str__(self):
        return self.town 

Теперь я могу использовать только all() в queryset для отображения всех городов. Мне кажется, что я должен использовать filter(), но я не могу найти способ сделать это。

#forms.py

class Location(forms.Form):

    state = forms.ModelChoiceField( required = True, 
                                    label = "State",
                                    queryset = State.objects.all(),
                                    widget = forms.Select(attrs = {
                                        "class": "form-list-field"}
                                    ))

    town = forms.ModelChoiceField(   required = True, 
                                label = "Town",
                                queryset = Town.objects.filter( ??? ).order_by('town'),
                                widget = forms.Select(attrs = {
                                    "class": "form-list-field"}
                                ))

вы можете достичь этого, используя

  1. Django формы
  2. ajax-запросы

forms.py

    class Location(forms.Form):
    
        state = forms.ModelChoiceField(
            required=True,
            label="State",
            queryset=State.objects.all(),
            widget=forms.Select(attrs={"class": "form-list-field"}),
        )
    
        town = forms.ModelChoiceField(
            required=True,
            label="Town",
            queryset=Town.objects.none(),
            widget=forms.Select(attrs={"class": "form-list-field"}),
        ) # need to populate this using jquery

теперь напишите метод в представлении для возврата городов на основе выбранного состояния

views.py

from django.http import HttpResponse


def get_towns(request, state_id):
    state = State.objects.get(pk=state_id)
    towns = Town.objects.filter(state=state)
    towns_dict = {}
    for town in towns:
        towns_dict[town.id] = town.town
    return HttpResponse(towns_dict, content_type='application/json')

в вашем html или API коде сделайте ajax запрос для получения списка городов при выборе штата

Я уже создал мини проект для достижения этих вещей. Он называется dependent drop-down

Plz clone this repo and run it.

Ссылка находится здесь

Вернуться на верх