Django-select2: Связанные селекты

В случае, когда есть необходимость организовать связанные селекты. На пример, в показывать список городов, исключительно для выбранной страны.

И так, в целом так же, вся магия происходит в файле form.py приложения, для которого создаем форму.

topology/forms.py
# -*- coding: utf-8 -*-

from django import forms
from django.utils.encoding import force_text

# Импортируем необходимые виджеты. В данном примере будем использовать только: ModelSelect2Widget
from django_select2.forms import (
    HeavySelect2MultipleWidget, HeavySelect2Widget, ModelSelect2MultipleWidget,
    ModelSelect2TagWidget, ModelSelect2Widget, Select2MultipleWidget,
    Select2Widget
)

class LocationForms(forms.Form):
	country = forms.ModelChoiceField(
		queryset=Country.objects.all(),
		label='Country',
		widget=ModelSelect2Widget(
			model=Country,
			search_fields=['name__icontains'],
			max_results=500,
		)
	)
	district = forms.ModelChoiceField(
		queryset=District.objects.all(),
		label='District',
		widget=ModelSelect2Widget(
			model=District,								# Название модели
			search_fields=['name__icontains'],			# AJAX поиск по полю БД
			max_results=500,
			dependent_fields={'country': 'country'},	# Указывает от какой модели БД зависит 
		)
	)
	city = forms.ModelChoiceField(
		queryset=City.objects.all(),
		label='City',
		widget=ModelSelect2Widget(
			model=City,
			search_fields=['name__icontains'],
			dependent_fields={'district': 'district'},
			max_results=500,
		)
	)

Модель выглядит

node/models.py
# -*- coding: utf-8 -*-
from django.db import models
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Country(models.Model):
	name = models.CharField(max_length=300)
	
	def __str__(self):
		return self.name
		
	
@python_2_unicode_compatible
class District(models.Model): 
	name = models.CharField(max_length=300, null=True, blank=True)
	country = models.ForeignKey(Country, related_name="country", on_delete=models.CASCADE, null=True, blank=True)
	
	def __str__(self):
		return self.name
	

@python_2_unicode_compatible
class City(models.Model):
	name = models.CharField(max_length=300, null=True, blank=True)
	district = models.ForeignKey(District, related_name="districts", on_delete=models.CASCADE, null=True, blank=True)
	
	def __str__(self):
		return self.name
		

Т.к. в модели для связки моделей спользуем ForeignKey, на примере таблицы District есть связность с таблицей Country

country = models.ForeignKey(Country, related_name="country", ...)

Соответственно в БД Countyry будет  выглядеть как  country_id и содержать в себе id родителя.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *