我的团队一直在使用"django-jet"作为我们django应用程序中管理员的皮肤。
我们有非常大的选择小部件的内联,所以正如 django-jet 文档所建议的那样,我们在模型中添加了autocomplete
字段。
问题是它不支持表格内联。检查 django-jet 的代码,您可以看到如何更改哪些内容以使小部件工作:
- 复制 Django 的管理员 "
tabular.html
" 在你的模板目录中。 - 在第一行加载
jet_tags
。 - 将筛选器
jet_select2_lookup
添加到字段中。
表格.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 中?
一年后,也许我可以帮你。
看看我做的这个公关 django-jet:
https://github.com/geex-arts/django-jet/pull/329
它会将表单字段的过滤器传递给 select2 元素,而 select2 元素又会在显示选项时将这些过滤器传递给 django-jet。它对我来说非常有效。
希望对您有所帮助。
事实上,这不是一个答案,而是对保罗公关的评论。
使用保罗的代码和没有过滤器,我收到了一个错误(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
但是我不知道过滤器是否一切正常(我没有测试过它,因为我不使用过滤器(。