如何在 django 管理站点中使用 django-select2 小部件?
Posted
技术标签:
【中文标题】如何在 django 管理站点中使用 django-select2 小部件?【英文标题】:How to use django-select2 widgets in django admin site? 【发布时间】:2021-09-06 02:36:57 【问题描述】:在我的 django 应用程序中,我修改了用户实体以包含一个工作字段 (OneToOneField)。但是从 django 管理站点该字段产生了这么多结果,因此登录用户很难选择工作人员。有什么方法可以使用 django 管理站点中的 select2 (ModelSelect2Widget) 小部件? 对于任何常规形式,我都通过以下方式定义了小部件:
from django_select2.forms import ModelSelect2Widget
class ProcessForm(forms.ModelForm):
class Meta:
model = ProcessModel
exclude = ('id',)
widgets =
'name':forms.TextInput(attrs='class': 'form-control'),
'code':forms.TextInput(attrs='class': 'form-control'),
'description':forms.Textarea(attrs='class': 'form-control'),
'geom': LeafletWidget(),
'product': ModelSelect2Widget(model=ProductModel, queryset=ProductModel.objects.filter(),
search_fields=['name__icontains'],
attrs='style': 'width: 100%;'),
有什么方法可以在管理站点表单中将 ModelSelect2Widget 用于工作人员字段? 这是我的代码:
class User(AbstractUser):
worker = models.OneToOneField(WorkerModel, on_delete=models.CASCADE,
related_name="user", verbose_name=_("Trabajador"), null=True, blank=True)
class Meta:
default_permissions = ()
verbose_name="Usuario"
verbose_name_plural="Usuarios"
permissions = (
("secretario", "Secretario(a)"),
("director", "Director"),
)
from django.contrib.auth.admin import UserAdmin
class UserAdminInherited(UserAdmin):
fieldsets = (
(None, 'fields': ('username', 'password')),
(_('Personal info'), 'fields': ('first_name', 'last_name', 'email')),
(_('Worker info'), 'fields': ('worker',)),
(_('Permissions'),
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
),
(_('Important dates'), 'fields': ('last_login', 'date_joined')),
)
admin.site.register(User, UserAdminInherited)
【问题讨论】:
【参考方案1】:由于Django 2.0.,我们可以使用autocomplete_fields
。
autocomplete_fields 是 ForeignKey 和/或 ManyToManyField 的列表 您想更改为 Select2 自动完成输入的字段。
ModelAdmin
(是UserAdmin
的父级)具有属性autocomplete_fields
(Django Docs):
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth import get_user_model
User = get_user_model()
class UserAdminInherited(UserAdmin):
autocomplete_fields = ['worker']
...
admin.site.register(User, UserAdminInherited)
您必须在相关对象的 ModelAdmin 上定义 search_fields 因为自动完成搜索使用它。
from django.contrib import admin
@admin.register(WorkerModel)
class WorkerModelAdmin(admin.ModelAdmin):
search_fields = ['model_field']
【讨论】:
非常感谢您的帮助。我刚刚发布了一个关于 django-select2 ***.com/questions/68660349/… 的新问题以上是关于如何在 django 管理站点中使用 django-select2 小部件?的主要内容,如果未能解决你的问题,请参考以下文章
如何从视图生成 Django 管理站点中特定项目的 url?
有没有一种简单的方法可以在 Django 管理站点中创建链式动态下拉列表?