django-autocomplete-light v3 自定义项目的输出并保存在表单中
django-autocomplete-light v3 Customising the output of items and conserve it in the form
在此之后(),我自定义了选项列表。
我的代码:
class WordAutocomplete(autocomplete.Select2QuerySetView):
...
def get_result_label(self, obj):
template = get_template("autocomplete_light/item.html")
context = Context({"item": obj})
return mark_safe(template.render(context))
表格:
class SentenceAdminForm(forms.ModelForm):
class Meta :
widgets = {
'word':autocomplete.ModelSelect2Multiple('WordAutocomplete',
attrs={'data-html': 'true'}),
}
模板 autocomplete/item.html :
<a href="url">{{ item }}</a>
如您所见,有链接,每个项目一个。
在我保存之前链接一直有效:
links are active in the list and in the select box
After saving, the links are no longer there
如何维护 select 框中的链接?
答案很简单。
首先,看看这篇关于 select2 本身的文章:Can I change how the placeholder looks?
好的,所以我们需要重新定义 templateResult 函数,或者至少找出它是如何工作的。
现在转到 dal 文档:Overriding javascript code
看起来像在 autocomplete.init.js 某处定义的 templateResult。是的,它就在那里:django-autocomplete-light/src/dal_select2/static/autocomplete_light/select2.js:47
函数本身:django-autocomplete-light/src/dal_select2/static/autocomplete_light/select2.js:7
顺便说一下,您在代码中提到了 data-html
个内容。
你可以调试js代码,console.log()它,发现这个函数适用于所有结果。在自动完成工作时动态获取,并通过页面 html 静态接收。这很好,所以您实际上需要做的就是以与呈现自动完成项相同的方式呈现 select 选项。不仅如此,根据您的代码,您甚至不必重新定义 get_result_label() 函数。
class Obj(models.Model):
...
def __str__(self): # __unicode__ on Python 2
template = get_template("autocomplete_light/item.html")
context = Context({"item": self.name}) # self.name or whatever
return template.render(context)
# or just:
# return '<a href="url">%s</a>' % self.name
class WordAutocomplete(autocomplete.Select2QuerySetView):
...
# Do not redefine get_result_label()
# def get_result_label(self, obj):
# template = get_template("autocomplete_light/item.html")
# context = Context({"item": obj})
# return mark_safe(template.render(context))
class SentenceAdminForm(forms.ModelForm):
class Meta :
widgets = {
'word': autocomplete.ModelSelect2Multiple(
'WordAutocomplete',
attrs={'data-html': 'true'}),
}
在此之后(
我的代码:
class WordAutocomplete(autocomplete.Select2QuerySetView):
...
def get_result_label(self, obj):
template = get_template("autocomplete_light/item.html")
context = Context({"item": obj})
return mark_safe(template.render(context))
表格:
class SentenceAdminForm(forms.ModelForm):
class Meta :
widgets = {
'word':autocomplete.ModelSelect2Multiple('WordAutocomplete',
attrs={'data-html': 'true'}),
}
模板 autocomplete/item.html :
<a href="url">{{ item }}</a>
如您所见,有链接,每个项目一个。
在我保存之前链接一直有效:
links are active in the list and in the select box
After saving, the links are no longer there
如何维护 select 框中的链接?
答案很简单。
首先,看看这篇关于 select2 本身的文章:Can I change how the placeholder looks?
好的,所以我们需要重新定义 templateResult 函数,或者至少找出它是如何工作的。
现在转到 dal 文档:Overriding javascript code
看起来像在 autocomplete.init.js 某处定义的 templateResult。是的,它就在那里:django-autocomplete-light/src/dal_select2/static/autocomplete_light/select2.js:47
函数本身:django-autocomplete-light/src/dal_select2/static/autocomplete_light/select2.js:7
顺便说一下,您在代码中提到了 data-html
个内容。
你可以调试js代码,console.log()它,发现这个函数适用于所有结果。在自动完成工作时动态获取,并通过页面 html 静态接收。这很好,所以您实际上需要做的就是以与呈现自动完成项相同的方式呈现 select 选项。不仅如此,根据您的代码,您甚至不必重新定义 get_result_label() 函数。
class Obj(models.Model):
...
def __str__(self): # __unicode__ on Python 2
template = get_template("autocomplete_light/item.html")
context = Context({"item": self.name}) # self.name or whatever
return template.render(context)
# or just:
# return '<a href="url">%s</a>' % self.name
class WordAutocomplete(autocomplete.Select2QuerySetView):
...
# Do not redefine get_result_label()
# def get_result_label(self, obj):
# template = get_template("autocomplete_light/item.html")
# context = Context({"item": obj})
# return mark_safe(template.render(context))
class SentenceAdminForm(forms.ModelForm):
class Meta :
widgets = {
'word': autocomplete.ModelSelect2Multiple(
'WordAutocomplete',
attrs={'data-html': 'true'}),
}