17

新手 Django 问题:我希望 Django 管理员在多选小部件中显示更多行选择。我有一个非常长的列表可供选择,默认的 4 行并不方便,尤其是在滚动时。

现在,该小部件呈现为select multiple但我希望它是select multiple size="12"。理想情况下,这应该针对特定字段,但我可以使用相同大小属性呈现的所有字段。

那么在 Django 中哪里是改变这一点的最佳位置呢?

4

4 回答 4

22

我在 admin.py 中通过为所有 ManyToManyField 项目设置一个毯子大小来做到这一点,例如:

from django.contrib import admin
from django.forms import SelectMultiple
from django.db import models
from models import *

class RiverAdmin(admin.ModelAdmin):
    formfield_overrides = { models.ManyToManyField: {'widget': SelectMultiple(attrs={'size':'10'})}, }

admin.site.register(River, RiverAdmin)
于 2012-09-27T03:45:51.327 回答
16

如果您有一个会不断增长的长选择,我建议使用自动完成小部件

无论如何,您可以:

  1. 为有问题的模型创建一个 ModelForm

  2. 为有问题的字段覆盖默认小部件

  3. 根据您的需要设置小部件的大小属性

  4. 例如,在 ModelAdmin 中启用该表单

    class YourModelForm(forms.ModelForm):
        class Meta:
            model = YourModel
            widgets = {
                'your_field': forms.SelectMultiple(attrs={'size': 12})
            }
    
    
    class YourModelAdmin(admin.ModelAdmin):
        form = YourModelForm
    
于 2012-09-11T08:41:13.560 回答
2

有一种方法可以做到这一点,就是覆盖 formfield_for_manytomany 来设置 size 属性。

def formfield_for_manytomany(self, db_field, request, **kwargs):
        form_field = super().formfield_for_manytomany(db_field, request, **kwargs)
        if db_field.name in [*self.filter_horizontal]:
            form_field.widget.attrs={'size': '10'}
        return form_field

于 2020-08-12T05:12:56.170 回答
0

我能够根据相关表行的初始数量来制作行数,但是它不会动态更新(可能需要将 Javascript 插入管理表单并通过 AJAX 查询行数,这太大了,无法在此处发布)。

class ProfileAdminForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = '__all__'
        widgets = {
            # Will dynamically change number of rows in select multiple, however only after server reload.
            'spec_profiles': forms.SelectMultiple(attrs={'size': SpecProfile.objects.count()})
        }

class ProfileAdmin(admin.ModelAdmin):
    form = ProfileAdminForm
于 2015-07-03T10:28:00.790 回答