使用TabularInlines制作Django-Jet自动完成功能

时间:2017-07-12 19:01:49

标签: python django autocomplete django-admin django-jet

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

我们推荐使用非常大的精选小部件,因此django-jet documentation建议我们在模型中添加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?

2 个答案:

答案 0 :(得分:2)

一年后,也许我可以帮助你。

看到我做的公关django-jet:

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

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

希望它有所帮助。

答案 1 :(得分:0)

实际上,这不是答案,而是对Paulo公关的评论。

使用Paulo的代码和不使用过滤器,我收到一个错误(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://stackoverflow.com/questions/45065632/making-django-jet-autocomplete-with-tabularinlines
    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

但是我不知道所有的过滤器是否都能正常工作(我没有测试过,因为我没有使用过滤器)。