2011-01-24 39 views

Trả lời

47

Từ this answer nó có vẻ như nó có thể sử dụng ModelAdmin.formfield_overrides để ghi đè lên ManyToManyField sử dụng 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}, 
    } 

Tôi đã không thử nó và đang chỉ trích dẫn từ nguồn, nhưng có vẻ như đáng tin cậy. Chúc may mắn.

Warning: như @errx đúng chỉ ra, documentation nổi bật caveat sau:

Nếu bạn muốn sử dụng một widget tùy chỉnh với một lĩnh vực liên quan (ví dụ ForeignKey hoặc ManyToManyField), đảm bảo rằng bạn chưa bao gồm tên của trường đó trong raw_id_fields hoặc radio_fields.

formfield_overrides sẽ không cho phép bạn thay đổi widget trên các lĩnh vực liên quan có raw_id_fields hoặc radio_fields bộ. Đó là vì raw_id_fieldsradio_fields ngụ ý các tiện ích tùy chỉnh của riêng mình.

+0

có cảnh báo từ tài liệu django. Nếu bạn muốn sử dụng tiện ích tùy chỉnh có trường quan hệ (ví dụ: ForeignKey hoặc ManyToManyField), hãy đảm bảo bạn chưa bao gồm tên của trường đó trong raw_id_fields hoặc radio_fields. formfield_overrides sẽ không cho phép bạn thay đổi tiện ích con trên các trường quan hệ đã đặt raw_id_fields hoặc radio_fields. Đó là vì raw_id_fields và radio_fields ngụ ý các tiện ích tùy chỉnh của riêng chúng. – errx

+0

Cảm ơn những người đứng đầu. Sẽ đặt cảnh báo trong câu trả lời. –

4

Đây là chắc chắn nhất có thể. Dưới đây là mã mà bạn có thể đặt trong lớp con 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) 

Điều này xuất phát từ việc nhìn vào mã quản trị.

4

Để ghi đè cho một trường duy nhất sau đây là hữu ích:

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 
Các vấn đề liên quan