新手 Django 问题:我希望 Django 管理员在多选小部件中显示更多行选择。我有一个非常长的列表可供选择,默认的 4 行并不方便,尤其是在滚动时。
现在,该小部件呈现为select multiple但我希望它是select multiple size="12"。理想情况下,这应该针对特定字段,但我可以使用相同大小属性呈现的所有字段。
那么在 Django 中哪里是改变这一点的最佳位置呢?
新手 Django 问题:我希望 Django 管理员在多选小部件中显示更多行选择。我有一个非常长的列表可供选择,默认的 4 行并不方便,尤其是在滚动时。
现在,该小部件呈现为select multiple但我希望它是select multiple size="12"。理想情况下,这应该针对特定字段,但我可以使用相同大小属性呈现的所有字段。
那么在 Django 中哪里是改变这一点的最佳位置呢?
我在 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)
如果您有一个会不断增长的长选择,我建议使用自动完成小部件。
无论如何,您可以:
为有问题的模型创建一个 ModelForm
根据您的需要设置小部件的大小属性
class YourModelForm(forms.ModelForm):
class Meta:
model = YourModel
widgets = {
'your_field': forms.SelectMultiple(attrs={'size': 12})
}
class YourModelAdmin(admin.ModelAdmin):
form = YourModelForm
有一种方法可以做到这一点,就是覆盖 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
我能够根据相关表行的初始数量来制作行数,但是它不会动态更新(可能需要将 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