如何使django-autocomplete光返回所选文本而不是id

时间:2018-01-24 18:24:56

标签: python django django-autocomplete-light

我有一个简单的表单,允许用户选择他的countrystatedistrict并重新显示所选数据。

除了显示的内容不是"文本"之外,一切都按预期工作。但是" ids"所选数据

期望:你属于印度,旁遮普,贾朗达尔。我也是。 ;)

输出:你属于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答案中提到的但没有收获的内容。应用此解决方案无法填充statedistrict

1 个答案:

答案 0 :(得分:0)

只需调用对象,您的表单即可生效。自动填充指示灯配置为返回ID,这是“选择窗口小部件”的默认行为。

jacoco.exec