【问题标题】:How to use django-select2 widgets in django admin site?如何在 django 管理站点中使用 django-select2 小部件?
【发布时间】: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)

【问题讨论】:

    标签: python django django-admin jquery-select2 django-select2


    【解决方案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']
    

    【讨论】:

    猜你喜欢
    • 2017-10-24
    • 2012-08-23
    • 1970-01-01
    • 2017-12-26
    • 2017-12-30
    • 2013-09-15
    • 2011-06-21
    • 2020-08-07
    • 2011-09-23
    相关资源
    最近更新 更多