【问题标题】:how o make django-autocomplete light return selected text not id如何使 django-autocomplete light 返回选定的文本而不是 id
【发布时间】:2018-01-24 18:24:56
【问题描述】:

我有一个简单的表单让用户选择他的countrystatedistrict 并重新显示选定的数据。

除了显示的不是所选数据的“文本”而是“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 答案中提到的内容,但没有任何收获。应用此解决方案无法选择填充 statedistrict

【问题讨论】:

  • 在您显示选项的模板中尝试get_country_display,并在视图中添加(),如get_country_display()

标签: python django django-autocomplete-light


【解决方案1】:

只需调用对象,以您的形式有效。自动完成灯被配置为返回 ID,这是 Select 小部件的默认行为。

def form_valid(self, form):)
    country_pk = self.request.POST["country"]
   state_pk = self.request.POST["state"]
   district_pk = self.request.POST["district"]
   country = Country.objects.get(pk = country_pk)
   #--- district
   #---- state
   #if you have defined a str method you can just proceed as
   #as below since the render will call __str__ else
   #you can use country.name, state.name, district.name
   msg = "You belong to {country}, {state}, {district}. Me too. 
   ;)".format(country=country, state=state, district=district)

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2016-03-29
    • 2017-03-26
    相关资源
    最近更新 更多