2011-01-24 116 views

回答

47

this answer现在看来似乎是可以使用ModelAdmin.formfield_overrides覆盖ManyToManyField使用CheckBoxSelectMultiple

from django.db import models 
from django.contrib import admin 
from django.forms import CheckboxSelectMultiple 

class MyModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.ManyToManyField: {'widget': CheckboxSelectMultiple}, 
    } 

我还没有尝试过了,我只是从源报价,但它似乎也合情合理。祝你好运。

警告:为@errx正确地指出的那样,documentation亮点如下警告:

如果你想使用自定义部件 有关系字段(即ForeignKeyManyToManyField ),请确保您 未在 raw_id_fieldsradio_fields中包含该字段的名称。

formfield_overrides不会让你 改变有raw_id_fieldsradio_fields组关系领域 小部件。这是因为 raw_id_fieldsradio_fields意味着 自己的自定义小部件。

+0

django文档有警告。 如果要使用具有关系字段的自定义小部件(即ForeignKey或ManyToManyField),请确保您未在​​raw_id_fields或radio_fields中包含该字段的名称。 formfield_overrides不会让您更改设置了raw_id_fields或radio_fields的关系字段上的窗口小部件。这是因为raw_id_fields和radio_fields意味着它们自己的自定义小部件。 – errx 2011-01-24 17:22:27

4

这肯定是可以的。这里是你可以在ModelAdmin子放置代码:

def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
    if db_field.name == 'your field name': 
     kwargs['widget'] = form_widgets.CheckboxSelectMultiple() 
     kwargs['help_text'] = '' 

    return db_field.formfield(**kwargs) 

这是从寻找到管理代码的。

4

要覆盖下面的一个字段是有用的:

def get_form(self, request, obj=None, **kwargs): 
    form = super(VNodeAdmin, self).get_form(request, obj, **kwargs) 
    form.base_fields['node_type'].widget = forms.CheckboxSelectMultiple() 
    return form