So, I’m currently porting a py project to Django and I need to implement some autocomplete based on the value of other fields in order to my project to work. Basically, I need the user to select the state and then the city from a list of cities of that previously selected state.
I’m succeeding in the state autocomplete, but not in the city autocomplete.
I have individual classes for Country, State and City to properly store the data. I want to select the data from these classes and save within another class (Project). I’m not currently using the country calss, not until i solve this problem.
So here is my code. Any help or insight are welcome. Thanks!
#models
class Country(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class State(models.Model):
name = models.CharField(max_length=50)
country = models.ForeignKey(Country, on_delete=models.PROTECT)
def __str__(self):
return self.name
class Meta:
ordering = ['name']
class City(models.Model):
name = models.CharField(max_length=50)
state = models.ForeignKey(State, on_delete=models.PROTECT)
def __str__(self):
return self.name
class Meta:
ordering = ['name']
class Project(models.Model):
client = models.CharField(max_length=200)
seller = models.CharField(max_length=200, null=True, blank=True)
project_number = models.IntegerField(null=True, blank=True)
uc = models.CharField(max_length=20)
doc = models.CharField(max_length=20)
doc_type = models.CharField(max_length=5)
branch_city = models.CharField(max_length=50)
state = models.ForeignKey(State, on_delete=models.PROTECT)
city = models.ForeignKey(City, on_delete=models.PROTECT)
street = models.CharField(max_length=200)
neighborhood = models.CharField(max_length=200)
#continues
#forms
class CreateUserForm(forms.ModelForm):
state = forms.ModelChoiceField(queryset=models.State.objects.all())
city = forms.ModelChoiceField(
queryset=models.City.objects.none(),
widget=autocomplete.ModelSelect2(
url='autocomplete/city/',
forward=['state']
)
)
class Meta:
model = models.Project
fields = ['client', 'seller', 'project_number', 'uc', 'doc',
'state', 'city', 'branch_city', 'street', 'neighborhood' #continues]
#views
class CityAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.forwarded.get('state'):
return City.objects.none()
qs = City.objects.all()
state= self.forwarded.get('state')
if state:
qs = qs.filter(state=state)
if self.q:
qs = qs.filter(name__icontains=self.q)
return qs.order_by('name')
#urls
path("autocomplete/city/", views.CityAutocomplete.as_view(), name="autocomplete-city")