使用TabularInlines实现Django-Jet自动完成功能

4

我的团队一直在我们的Django应用程序中使用"django-jet"作为管理员的皮肤。

我们有非常大的选择小部件,所以正如django-jet文档建议的那样,我们在我们的模型中添加了autocomplete字段。

问题是它不支持TabularInlines。检查django-jet的代码,你可以看到需要改变什么来使小部件工作:

  • 在您的模板目录中复制Django的管理员"tabular.html"。
  • 在第一行加载jet_tags
  • 将过滤器jet_select2_lookup添加到字段中。

tabular.html

1 {% load i18n admin_urls static admin_modify jet_tags %}
...
...
55               {% if field.is_readonly %}
56                   <p>{{ field.contents }}</p>
57               {% else %}
58                   {{ field.field.errors.as_ul }}
59                   {{ field.field|jet_select2_lookups }}
60               {% endif %}

这种方法可以添加自动完成小部件,但会出现“无效选项”错误。
同时,该小部件似乎没有使用在管理中定义的formfield_for_foreignkey方法,因此查询集没有被过滤。
是否有人成功地在使用django-jet的TabularInline中添加了自动完成?

1
感谢Luis在他的问题中提供了出色的解决方案!现在我的管理表单加载时间从15秒缩短到了1秒。我没有在选择器中使用任何过滤器,所以没有遇到任何问题。然而,当我想要实现Paulo的PR时,我遇到了一些错误。更多细节请查看单独的回答。 - mirek
2个回答

2

也许过了一年,我能帮到你了。

看看我为django-jet制作的这个PR:

https://github.com/geex-arts/django-jet/pull/329

它将表单字段的过滤器传递给select2元素,而select2元素将这些过滤器传递给django-jet,在显示选项时使用。 对我来说,它完美地工作。

希望它有所帮助。


谢谢,我会检查你的代码。我目前正在为这个项目添加一些新需求,并在Django Jet中进行一些更改。一年前,我使用Django扩展自动完成Admin类使其工作。如果这行得通,我会告诉你的。 - Luis Alberto Santana

0
事实上,这不是一个答案,而是对保罗的PR的评论。
使用保罗的代码且没有过滤器时,我收到了一个错误(Django 2.2.1):
ERROR Internal Server Error: /jet/model_lookup/
Traceback (most recent call last):
  File "/home/mirek/dj/rian/ve_rian/lib/python3.7/site-packages/django/utils/datastructures.py", line 78, in __getitem__
list_ = super().__getitem__(key)
KeyError: 'filters'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mirek/dj/rian/ve_rian/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/mirek/dj/rian/ve_rian/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/mirek/dj/rian/ve_rian/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/mirek/dj/rian/ve_rian/lib/python3.7/site-packages/django/views/decorators/http.py", line 40, in inner
    return func(request, *args, **kwargs)
  File "/home/mirek/dj/rian/isms/django-jet/jet/views.py", line 64, in model_lookup_view
    items, total = form.lookup()
  File "/home/mirek/dj/rian/isms/django-jet/jet/forms.py", line 135, in lookup
    qs.query.__dict__ = pickle.loads(codecs.decode(self.data['filters'].encode(), 'base64'))
  File "/home/mirek/dj/rian/ve_rian/lib/python3.7/site-packages/django/utils/datastructures.py", line 80, in __getitem__
    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'filters'

如果我在jet/forms.py中更改您的代码,这个错误就不会再出现了:

def lookup(self):
    # patch: https://github.com/geex-arts/django-jet/pull/329/files https://dev59.com/JqPia4cB1Zd3GeqPxmAI
    if 'filters' in self.data:
        qs = self.model_cls.objects.all()
        qs.query.__dict__ = pickle.loads(codecs.decode(self.data['filters'].encode(), 'base64'))
    else:
        qs = self.model_cls.objects

然而我不知道过滤器是否完全正常工作(因为我没有测试过,因为我不使用过滤器)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接