ここではたくさんのことが起こっているので、答えを少しずつ説明します。
「開発者」が管理システムにログインできるようにするのが最善の方法ですか?
それはあなたの設定に依存します。一般に、管理者は「スタッフ」、つまり組織に雇用されている、または組織に直接関係している人だけが利用できるようにする必要があります。実際、管理者にログインするには、ユーザーはを持っている必要がありますis_staff=True
。すべてのユーザーが組織に属している場合(結果として「信頼できる」と見なすことができる場合)、はい、すべてのユーザーに管理者へのアクセスを許可することは問題ありません。それ以外の場合は、セキュリティリスクにさらされているため、お勧めできません。
もしそうなら、どうすれば管理者のユーザーフォームに表示するブールフィールドを取得できますか?
ModelForm
最も単純な意味では、モデルのフィールドからフィールドに事前入力されている場合でも、フォームクラスに文字通りフィールドを追加することで、フォームにフィールドを追加できます。
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
is_developer = forms.BooleanField(default=False)
userProfileとして追加しましたが、フォームに表示する方法がわかりません
UserProfile
は別のモデルであることは明らかです。そのため、そのフィールドはのフォームでは使用できませんUser
。ただし、Djangoには、別のモデルの編集フォームに合わせて関連モデルを追加/編集する機能があります。これは、インラインフォームセットを介して行われます。管理者では、これらは単に「インライン」と呼ばれます。
class UserProfileInlineAdmin(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
class UserAdmin(admin.ModelAdmin):
inlines = [UserProfileInlineAdmin]
ただし、インライン管理者から取得するビューは、メインフォーム(この場合は)とは明らかに異なりUser
ます。あなたは私が何を意味するかを見るためにそれを試してみることができます。それはひどいことではありませんが、それでもフォームの顕著な中断です。以前にフォームにフィールドを追加する方法について説明した理由は、必要に応じて、少し巧妙な方向を間違えただけで、すべてを1つのフォームのように見せることができるためです。
class UserAdminForm(forms.ModelForm):
class Meta:
model = User
is_developer = forms.BooleanField(default=False)
def save(self, commit=True):
user = super(UserAdminForm, self).save(commit=commit)
if user.pk:
profile = user.get_profile()
profile.is_developer = self.cleaned_data.get('is_developer')
profile.save()
これは単純な例ですが、フィールドを手動でフォームに追加し、編集中のメインオブジェクトが保存されるときに、それらを使用して他のオブジェクトを手動で実際に更新するという考え方です。
関連する特記事項User
さて、あなたはここで扱ってUser
いるので、もっと多くの厄介な詳細があります。まず、User
すでにaUserAdmin
と独自のフォームがあります-はい、複数形です。新しい機能を追加する場合は、プロセスで既存のDjango機能を維持する必要があります。
from django.contrib.auth.admin import UserAdmin
form django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class CustomUserCreationForm(UserCreationForm):
# do stuff
class CustomUserChangeForm(UserChangeForm):
# do stuff
class CustomUserAdmin(UserAdmin):
form = CustomUserChangeForm
add_form = CustomUserCreationForm
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
また、UserAdmin
独自のフィールドセットのセットが定義されています。デフォルトは次のとおりです。
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Groups'), {'fields': ('groups',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'password1', 'password2')}
),
)
1つまたは複数のフィールドを追加する場合は、必要な場所にフィールドを追加して、これら2つの属性を再定義する必要があります。