これに関連して質問したことがあります。でも直接質問したほうがいいと思います。他の2つのテーブル「ドメイン」および「グループ」と多対多の関係を持つ「ユーザー」テーブルがあります。したがって、管理インターフェイスでは、グループとドメインが 2 つの ModelMultipleChoiceField として表示されます。しかし、私はそれらをよりユーザーフレンドリーな方法で UI に表示したいと考えています。ユーザープロパティに応じて選択/選択解除されるチェックボックスを使用して、ドメインとグループで利用可能な各選択肢を表示したいと思います。管理者でこれを行うことができるかどうか、または管理者とは無関係に独自のビューを作成する必要があるかどうか疑問に思っていました。
5 に答える
組み込みのウィジェットCheckboxSelectMultiple
はあなたが望むことをすると思います。そうでない場合は、独自のウィジェットを作成する必要があります。ウィジェットのドキュメントは、開始するのに適した場所です。開始する最も簡単な方法は、Django ソースから既存のウィジェットをコピーして変更することです。
正確には、Django 管理者が ManyToManyField の場合に表示することを選択したウィジェットです。この場合、あなたが感じる SelectMultiple ウィジェットは、ユーザーフレンドリーではありません。
簡単なのは、独自の ModelForm を使用しているときにいつでもウィジェットを選択できることです。ただし、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 でルーチン管理者を次のように定義します。
class SomeModelAdmin(MyModelAdmin):
search_fields = ['foo', 'bar']
list_display = ('foo',)
ordering = ('-bar',)
admin.site.register(SomeModel, SomeModelAdmin)
DJango Admin にチェックボックスが表示されるようになりました。もちろん、いくつかの CSS の変更が必要になります。
実際には、管理画面でデフォルトでモデル フォームを使用します。したがって、上書きする必要があります。
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 フィールド タイプを上書きしました。
あなたが何をしようとしているのか完全にはわかりませんが、おそらくfilter_horizontalのようなものがあなたの望むことをするでしょう。
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)