Я установил django-cities-light и django-autocomplete-light. Все шло хорошо, пока я не попытался запретить пользователю выбирать Брюссель в качестве региона, если он ввел Францию в качестве страны.
Я следил за учебником здесь: http://django-autocomplete-light.readthedocs.org/en/v2/dependant.html, но я как-то упустил важную деталь.
Приложение автозаполнения работает нормально, но ограничений нет. Поскольку я не знаю, каким должен быть носитель класса, я предполагаю, что проблема может заключаться в этом. Более того, в документах говорится, что он используется для загрузки некоторого дополнительного кода javascript, и, похоже, он не загружается, поскольку приложение работает нормально.
Вот мои модели.py
from django.db import models
from user.models import User
from cities_light.models import City, Country, Region
class Offer(models.Model):
publisher = models.ForeignKey(User)
content = models.TextField()
date = models.DateTimeField(auto_now_add=True, auto_now=False)
country = models.ForeignKey(Country)
region = models.ForeignKey(Region)
city = models.ForeignKey(City)
autocomplete_light_registry.py
import autocomplete_light
from offers.models import Offer
from cities_light.models import Country, Region, City
class CountryAutocomplete(autocomplete_light.AutocompleteModelBase):
attrs={'placeholder': 'Choisissez votre Pays'}
search_fields=('search_names', 'alternate_names',)
def choices_for_request(self):
q = self.request.GET.get('q', '')
country_id = self.request.GET.get('country_id', None)
choices = self.choices.all()
if q:
choices = choices.filter(name_ascii__icontains=q)
if country_id:
choices = choices.filter(country_id=country_id)
return self.order_choices(choices)[0:self.limit_choices]
autocomplete_light.register(Country, CountryAutocomplete)
class RegionAutocomplete(autocomplete_light.AutocompleteModelBase):
attrs={'placeholder': 'region name ..'}
search_fields=('search_names', 'alternate_names',)
def choices_for_request(self):
q = self.request.GET.get('q', '')
country_id = self.request.GET.get('country_id', None)
choices = self.choices.all()
if q:
choices = choices.filter(name_ascii__icontains=q)
if country_id:
choices = choices.filter(country_id=country_id)
return self.order_choices(choices)[0:self.limit_choices]
autocomplete_light.register(Region, RegionAutocomplete)
class CityAutocomplete(autocomplete_light.AutocompleteModelBase):
attrs={'placeholder': 'Choisissez votre ville'}
search_fields=('search_names', 'alternate_names',)
def choices_for_request(self):
q = self.request.GET.get('q', '')
city_id = self.request.GET.get('city_id', None)
choices = self.choices.all()
if q:
choices = choices.filter(name_ascii__icontains=q)
if city_id:
choices = choices.filter(country_id=country_id)
return self.order_choices(choices)[0:self.limit_choices]
autocomplete_light.register(City, CityAutocomplete)
формы.py
from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from offers.models import Offer, LevelChoices, CoursChoices
import autocomplete_light
class SendOfferForm(autocomplete_light.ModelForm):
class Media:
js = ('dependant_autocomplete.js',)
class Meta:
model = Offer
autocomplete_fields = ("country", "region", "city")
fields = ('country', 'region', 'city', 'content')
РЕДАКТИРОВАТЬ
Я обнаружил, что если я удалю весь код после поля attrs в autocomplete_light_registry.py, ничего не изменится. Что-то не распознается django. Я проверил свой settings.py, но все в порядке.
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, '/media/')