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', )
3条答案
按热度按时间9jyewag01#
实际上,可以从管理员使用select 2。你只需要使用
AutocompleteSelect
小部件。AutocompleteSelect小部件需要一个关系和一个管理站点。如果您的模型
A
具有ForeignKey字段指向您想要使用自动完成选择的模型B
,则只需使用(如cuto所建议的)字符串
因为我没有关系,所以使用了
FakeRelation
类,因为get_url(self)
函数只使用model属性。AutocompleteSelect小部件的使用与autocompete_fields小部件的使用绑定在相同的条件下。型
正如jenniwren所指出的:请确保在模板中加载正确的Javascript/CSS文件(路径可能会在不同的django版本中发生变化):
或者简单地将
{{ form.media }}
添加到模板中,如software engineer所指出的。5cnsuln72#
之前提出的FakeRelation解决方案不再适用于Django 2.2,它需要一个字段示例用于AutocompleteSelect构造函数。
我的项目中有一个合适的字段,所以我可以使用它,但必须传递一个字段示例而不是关系。下面是自定义AutocompleateSelect的代码,它还添加了将特定占位符传递给Select2的选项:
字符串
如果一个人没有一个具有合适关系的模型,那么他们将不得不声明一个不受管理的模型:
型
igsr9ssn3#
我花了几个小时试图理解为什么我的代码不能工作,直到我偶然发现@jenniwren关于引用css/js文件的评论。这是一个完整的工作解决方案。
要在任何自定义表单中使用AutocompleeSelect小部件,这些小部件对给定模型具有“staff”和“view”访问权限,您可以声明以下内容:
字符串
您可以使用相同的,将
CustomUser
和Play
替换为您自己的型号如果在你使用的html模板中,这并不能立即工作,那意味着你需要在模板中包含所需的css/js文件。这里有一个简单的方法来做到这一点:
假设窗体在视图中声明为:
型
您应该在html模板中添加以下行,以包含所需的css/js文件:
型