Как получить поля "город" в зависимости от поля "страна" в моделях 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')),
Другие вопросы по тегам