覆盖Django Admin多选小部件的大小

时间:2012-09-08 11:46:54

标签: django django-admin

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

目前,该窗口小部件呈现为选择多个,但我希望选择多个尺寸=“12”。理想情况下,这应该适用于特定字段,但我可以使用相同大小属性的所有字段渲染。

那么Django改变它的最佳位置是什么?

4 个答案:

答案 0 :(得分:21)

我在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)

答案 1 :(得分:14)

如果您选择的长片会继续增长,我建议使用autocomplete widget

无论如何,你可以:

  1. Create a ModelForm ,对于相关模型

  2. Override the default widget ,对于相关字段,

  3. Set widget's size attribute 满足您的需求

  4. Enable that form in ModelAdmin ,例如

    class YourModelForm(forms.ModelForm):
        class Meta:
            model = YourModel
            widgets = {
                'your_field': forms.SelectMultiple(attrs={'size': 12})
            }
    
    
    class YourModelAdmin(admin.ModelAdmin):
        form = YourModelForm
    

答案 2 :(得分:1)

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

Amazon WorkSpaces

Unable to connect
We couldn't launch your WorkSpace. Please try again.
If you need help, contact your administrator.

答案 3 :(得分: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