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'}),
        }