Python django autocomplete light v3定制项目输出并将其保存在表单中

Python django autocomplete light v3定制项目输出并将其保存在表单中,python,django,django-autocomplete-light,Python,Django,Django Autocomplete Light,在这个()之后,我定制了选项列表 我的代码: 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.

在这个()之后,我定制了选项列表

我的代码:

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>

如您所见,有链接,每个项目一个

在我保存之前,链接处于活动状态:


如何维护选择框中的链接?

答案很简单

首先,看看这篇关于select2本身的文章:

好的,所以我们需要重新定义templateResult函数,或者至少了解它是如何工作的

现在转到dal文档:

看起来像是在autocomplete.init.js中定义的templateResult。是的,它在那边:

以及功能本身:

顺便说一下,您在代码中提到了
数据html
内容

您可以调试js代码console.log()并发现此函数适用于所有结果。在autocomplete工作时动态获取,也通过页面html静态接收。这很好,所以您实际上需要做的就是以与渲染自动完成项相同的方式渲染选择选项。更重要的是,根据您的代码,您甚至不必重新定义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'}),
        }
Obj类(models.Model):
...
定义(self):Python 2上的unicode
template=get\u template(“autocomplete\u light/item.html”)
context=context({“item”:self.name})#self.name或其他什么
返回template.render(上下文)
#或者只是:
#返回“%self.name”
类字自动完成(自动完成。选择2QuerySetView):
...
#不重新定义get_result_label()
#def get_结果_标签(自身、obj):
#template=get\u template(“autocomplete\u light/item.html”)
#上下文=上下文({“item”:obj})
#返回mark_safe(template.render(context))
类语句AdminForm(forms.ModelForm):
类元:
小部件={
“word”:autocomplete.ModelSelect2Multiple(
“WordAutocomplete”,
attrs={'data-html':'true'}),
}

使用此代码,它可以工作:类Obj(models.Model):。。。def__str__(self):返回“%self.name”,但它不适用于:类Obj(models.Model):。。。def\uuu unicode\uuuu(self):返回“%self.name”,不管你怎么帮我做的!