Как реализовать данную сущность моделей в Django?
имеется модель Country
, например, с такими полями:
class Country(models.Model):
name = models.CharField(max_length=255)
Также имеется модель Continent
, у которой такие поля:
class Continent(models.Model):
country = models.ManyToManyField(Country)
name = models.CharField(max_length=255)
И имеется третья модель, пусть будет Location
. У нее есть поля country
и continent
, при чем в обоих этих полях можно вести только одно значение, то есть связь должна быть ForeignKey
. И поле country
должно зависеть от привязанных значений к выбранному на текущий момент continent
. То есть при выборе country
там должны быть доступны только те страны, который были привязан к выбранному на данный момент continent
. Как такое можно организовать и привязать к админке Django?
Рекомендую использовать виджет ModelChoiceField
для поля country в модели Location
. В методе __init__
формы для этого поля можно установить queryset
на основе выбранного значения для поля continent
.
class LocationForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
continent = self.data.get('continent')
if continent:
continent = Continent.objects.get(pk=continent)
self.fields['country'].queryset = continent.countries.all()
else:
self.fields['country'].queryset = Country.objects.none()
class Meta:
model = Location
fields = ['continent', 'country']
Чтобы это организовать и привязать к админке Django возьмите LocationForm
в классе ModelAdmin
для модели Location
:
class LocationAdmin(admin.ModelAdmin):
form = LocationForm
admin.site.register(Location, LocationAdmin)
Это заставит Django использовать ваш форму в админке вместо стандартной. Когда пользователь выбирает значение для поля continent
, queryset
для поля country
будет обновляться в соответствии с выбранным значением для continent
.