5

私はdjangoとpythonの完全なn00bです。私はPHPのバックグラウンドを持っているので、そのことについての私の謝罪を受け入れる必要があります:p。

djangoの管理パネル機能を使用して、さまざまな人にさまざまなオプションを表示しようとしています。

システムは、管理者が「プロジェクト」をリストに追加できるようにする必要があります。「開発者」は、自分に割り当てられたプロジェクトのみを表示し、特定のフィールドのみを変更できるようにする必要があります。

ですから、問題は2つあると思います。

1)「開発者」が管理システムにログインできるようにするのが最善の方法ですか?

1.a)その場合、管理者のユーザーフォームにブールフィールドを表示するにはどうすればよいですか?is_developerにフラグを立てたいだけです。userProfileとして追加しましたが、フォームに表示する方法がわかりません

2)(管理パネルへの)ログインを禁止し、許可されているものだけを表示できる「フロントエンド」を作成する必要がありますか?

それが理にかなっていることを願っています。それは私が慣れているものへの完全な出発であるため、私は今のところ少しいたるところにいます!

あなたが私に提供できるどんな助けにも前もって感謝します:)

4

1 に答える 1

9

ここではたくさんのことが起こっているので、答えを少しずつ説明します。

「開発者」が管理システムにログインできるようにするのが最善の方法ですか?

それはあなたの設定に依存します。一般に、管理者は「スタッフ」、つまり組織に雇用されている、または組織に直接関係している人だけが利用できるようにする必要があります。実際、管理者にログインするには、ユーザーはを持っている必要があります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つの属性を再定義する必要があります。

于 2012-08-02T20:13:05.183 に答える