如何在 django 管理站点中使用 django-select2 小部件?

问题描述

在我的 django 应用程序中,我修改了 User 实体以包含一个工作字段 (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)

解决方法

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']