【发布时间】:2018-01-24 18:24:56
【问题描述】:
我有一个简单的表单让用户选择他的country、state 和district 并重新显示选定的数据。
除了显示的不是所选数据的“文本”而是“ID”之外,一切都按预期进行。
期望:你属于印度、旁遮普、贾朗达尔。我也是。 ;)
输出:你属于 1、2、4。我也是。 ;)
# my form
class MyInfoForm(forms.Form):
country = forms.ModelChoiceField(
queryset=Country.objects.all(),
widget=autocomplete.ListSelect2(
url='country-autocomplete',
)
)
state = forms.ModelChoiceField(
queryset=State.objects.all(),
widget=autocomplete.ListSelect2(
url='state-autocomplete',
forward=(forward.Field('country'),)
)
)
district = forms.ModelChoiceField(
queryset=District.objects.all(),
widget=autocomplete.ListSelect2(
url='district-autocomplete',
forward=(forward.Field('state'),)
)
)
# my view which handles MyInfoForm
class CountryView(FormView):
template_name = 'home.html'
form_class = MyInfoForm
success_url = '/thanks/'
def form_valid(self, form):
print("Request :", self.request.POST)
country = self.request.POST["country"]
state = self.request.POST["state"]
district = self.request.POST["district"]
msg = "You belong to {country}, {state}, {district}. Me too. ;)".format(
country=country, state=state, district=district)
return HttpResponse(msg)
# other auto-complete views (similar to official tutorials)
class CountryAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated():
return Country.objects.none()
qs = Country.objects.all()
if self.q:
qs = qs.filter(country_name__istartswith=self.q)
return qs
class StateAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.request.user.is_authenticated():
return State.objects.none()
qs = State.objects.all()
country = self.forwarded.get('country', None)
if country:
qs = qs.filter(country_name=country)
if self.q:
qs = qs.filter(state_name__istartswith=self.q)
return qs
class DistrictAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.request.user.is_authenticated():
return District.objects.none()
qs = District.objects.all()
state = self.forwarded.get('state', None)
if state:
qs = qs.filter(state_name=state)
if self.q:
qs = qs.filter(district_name__istartswith=self.q)
return qs
# models
class Country(models.Model):
country_name = models.CharField(max_length=30)
def __str__(self):
return self.country_name
class State(models.Model):
country_name = models.ForeignKey(Country)
state_name = models.CharField(max_length=30)
def __str__(self):
return self.state_name
class District(models.Model):
state_name = models.ForeignKey(State)
district_name = models.CharField(max_length=30)
def __str__(self):
return self.district_name
我应用了这个SO 答案中提到的内容,但没有任何收获。应用此解决方案无法选择填充 state 和 district。
【问题讨论】:
-
在您显示选项的模板中尝试
get_country_display,并在视图中添加(),如get_country_display()
标签: python django django-autocomplete-light