Python Django表格

Python Django表格,python,django,django-admin,Python,Django,Django Admin,我问了一个与此相关的问题。但我认为最好直接问我的问题。 我有一个“用户”表,它与另外两个表“域”和“组”有很多关系。 因此,在管理界面中,我将组和域视为2个ModelMultipleChiceFields。 但是我想以一种更用户友好的方式在UI上展示它们。 我想用一个复选框显示域和组中的每个可用选项,该复选框根据用户属性选择/取消选择。 我想知道我是否可以在admin中这样做,或者我需要独立于admin编写自己的视图 我认为内置小部件复选框selectmultiple可以满足您的需要。如果没有,

我问了一个与此相关的问题。但我认为最好直接问我的问题。 我有一个“用户”表,它与另外两个表“域”和“组”有很多关系。 因此,在管理界面中,我将组和域视为2个ModelMultipleChiceFields。 但是我想以一种更用户友好的方式在UI上展示它们。 我想用一个复选框显示域和组中的每个可用选项,该复选框根据用户属性选择/取消选择。
我想知道我是否可以在admin中这样做,或者我需要独立于admin编写自己的视图

我认为内置小部件
复选框selectmultiple
可以满足您的需要。如果没有,您将不得不创建自己的小部件。这是一个很好的开始。最简单的开始方法是从Django源代码复制一个现有的小部件并对其进行修改。

我不完全确定我是否理解您正在尝试做什么,但可能类似的东西会做您想要做的事情。

它实际上在管理中默认使用模型表单。所以,您需要覆盖它

from django import forms
from django.forms import widgets

class DomainForm(forms.ModelForm):

    field2 = YourField(widget=widgets.CheckboxSelectMultiple)

    class Meta:
        model = Domain()
        fields = ('field1', 'field2')

因此,在本例中,我覆盖了默认的FIELD2字段类型。

准确地说,它是Django Admin在ManyToManyField中选择显示的小部件。 在本例中,您觉得SelectMultiple小部件的用户友好性较差

简单的一点是,您可以在使用自己的模型表单时选择小部件。 但如果你想在Django Admin中实现这一点,你需要一次往返。看看这个

from django.forms import widgets
from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
    """
    Get a form Field for a ManyToManyField.
    """
    # If it uses an intermediary model, don't show field in admin.
    if db_field.rel.through is not None:
        return None

    if db_field.name in self.raw_id_fields:
        kwargs['widget'] = admin.widgets.ManyToManyRawIdWidget(db_field.rel)
        kwargs['help_text'] = ''
    elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
        kwargs['widget'] = admin.widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))
    else:
        kwargs['widget'] = widgets.CheckboxSelectMultiple()
        kwargs['help_text'] = ''

    return db_field.formfield(**kwargs)
现在,将admin.py中的例程admin定义为

class SomeModelAdmin(MyModelAdmin):
    search_fields = ['foo', 'bar']
    list_display   = ('foo',)
    ordering       = ('-bar',)

admin.site.register(SomeModel, SomeModelAdmin)

您现在将在DJango Admin中获得复选框。当然,您需要一些CSS更改。

您可以更改django管理界面字段小部件

from django.forms import widgets

class UserAdmin(admin.ModelAdmin):
    model = User

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        if db_field.name == 'domain' or db_field.name == 'groups':
        kwargs['widget'] = widgets.CheckboxSelectMultiple()

        # or just make all the manytomany fields as checkbox

        kwargs['widget'] = widgets.CheckboxSelectMultiple()

        return db_field.formfield(**kwargs)

    # for other field
    def formfield_for_dbfield(self, db_field, **kwargs):
        .....
        return super(UserAdmin, self).formfield_for_dbfield(db_field, **kwargs)

admin.site.register(User, UserAdmin)

-1我不认为一个CheckboxInput对许多字段都有效。