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