我花了几个小时试图理解为什么我的代码不起作用,直到我偶然发现@jenniwren 关于引用 css/js 文件的评论。这是一个完整的工作解决方案。
要在任何自定义表单中为对给定模型具有“员工”和“查看”访问权限的登录用户使用 AutocompleteSelect 小部件,您可以声明以下内容:
from django.urls import reverse
from django.contrib.admin.widgets import AutocompleteSelect
from django.contrib import admin
class UserAutocompleteSelect(AutocompleteSelect):
def get_url(self):
model = CustomUser
return reverse(self.url_name % (self.admin_site.name, model._meta.app_label, model._meta.model_name))
class UserChoiceField(forms.ModelChoiceField):
def __init__(self, queryset=None, widget=None, **kwargs):
if queryset is None:
queryset = CustomUser.objects.all()
if widget is None:
widget = UserAutocompleteSelect(None, admin.site) # pass `None` for `rel`
super().__init__(queryset, widget=widget, **kwargs)
class UserAutocompleteSelectForm(forms.ModelForm):
"""
for changing user on Play objects
using amdin module autocomplete
"""
user = UserChoiceField(
# queryset=CustomUser.objects.all(),
help_text=_('Select the user to replace the current one')
)
class Meta:
model = Play
fields = ('user', )
您可以使用相同的方法,将 CustomUser 和 Play 替换为您自己的模型
如果这不适用于您正在使用的 html 模板开箱即用,这意味着您需要将所需的 css/js 文件包含到您的模板中。这是一个简单的方法:
如果表单在视图中声明为这样:
form = UserAutocompleteSelectForm()
...
context = {
'form': form,
...
}
return render(request, 'users/change_user.html', context)
您应该将以下行添加到 html 模板以包含所需的 css/js 文件:
{% block extrahead %}
{{ block.super }}
{{ form.media }}
{% endblock %}