Как получить поля "город" в зависимости от поля "страна" в моделях Django, не создавая их таблицы
Я знаю, что есть несколько вопросов, таких как этот (например, этот), но ни один из них не может помочь мне с моей проблемой.
Я хочу, чтобы в моих моделях было поле "Город" и "Страна", выбор которых зависит от страны; НО я не хочу определять город и страну как классы моделей. вот мой код:
from django.contrib.auth.models import User
from django.db import models
from django.forms import ChoiceField
from django_countries.fields import CountryField
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name="UserProfile")
name = models.CharField(max_length=30, null=False, blank=False)
picture = models.ImageField(upload_to='userProfiles/', null=False, blank=False)
date_of_birth = models.DateTimeField(null=False, blank=False)
country = CountryField()
# city = ??
national_code = models.IntegerField(max_length=10, null=False, blank=False)
email = models.EmailField()
def __str__(self):
return '{}'.format(self.user.username)
def __unicode__(self):
return self.user.username
так же, как поле "страна", которая country = CountryField()
Интересно, есть ли способ, которым я мог бы выполнить миссию без определения class Country(models.Model)
или же class City(models.Model)
3 ответа
Для этого вы можете использовать django-города.
Однако это не решит проблему с логикой ввода - если вам нужно что-то вроде фильтрации городов после выбора страны в ваших формах. Вы можете использовать для этого django-smart-select, но я не уверен, насколько легко реализовать сложную структуру модели django-city.
Единственный способ для этого будет определить выбор в вашей модели:
class UserProfile(models.Model):
CITIES = (
('ny', 'New York'),
('sm', 'Santa Monica')
# .. etc
)
city = models.CharField(max_length=5, choices=CITIES, blank=True)
У меня была та же проблема, и я использовал django-cities-light для заполнения города и регионов / стран, а django-smart-selects для фильтрации полученного кода был таким же и хорошо работал в админке и в формах:
from django.db import models
from cities_light.models import City
from cities_light.models import Region
from smart_selects.db_fields import ChainedForeignKey
class Address(models.Model):
....
state = models.ForeignKey(Region, on_delete=models.CASCADE)
city = ChainedForeignKey(City, chained_field="state", chained_model_field="region")
Не забудьте добавить «cities_light» и «smart_selects» в INSTALLED_APPS. Также добавьте "smart_selects" к URL-адресам.
path('chaining/', include('smart_selects.urls')),