2017-07-20 9 views
0

私は継承したdjangoプロジェクトに取り組んでおり、ユーザーの 'is_staff'属性を設定するときに検証を追加したいと考えています。私はどのように考え出すことができません...UserChangeFormに自分自身の 'clean_is_staff'を提供するには?

私の目標は、通常のユーザー(この場合、学生)に誤って 'is_staff'特権を与えられないようにすることです。これは、この悪いことをしないように既存の管理者を訓練する以上の余分な保護です。

プロジェクトは標準のauth.userを使用し、独自のProfileクラスを持っています。それはすべて正常に動作します。学生が登録すると、UserオブジェクトとProfileオブジェクトが登録されます。スタッフのユーザーは、Admin UIで標準の「新規ユーザーの追加」アクションを使用して、管理者のみが作成する必要があります。

ところで、これはDjango 1.8です。

私は、管理者が 'is_staff'をTrueに設定して変更を保存しようとしたときに、編集中のユーザーにプロファイルオブジェクトがある場合、カスタム 'clean_is_staff()'メソッドを追加してValidationErrorを発生させます。

私は、ValidatingUserChangeFormのコードパスを持つために、 'ValidatingUserChangeForm'をUserChangeFormのサブクラスとして書き、論理を入れ、 'ValidatingUserAdmin'と書きました。

これは機能しません。私のValidatingUserAdminは正常に動作するようですが、私のValidatingUserChangeFormは無視されます。私はそれが私の責任であると確信しています。

この投稿にコメントで出力します。

from change.forms import ValidatingUserChangeForm 


class ValidatingUserAdmin(admin.ModelAdmin): 

def __init__(self, name='admin', app_name='admin'): 
    super(ValidatingUserAdmin, self).__init__(self, name='admin', app_name='admin') 

def get_form(self, request, obj=None, **kwargs): 
    form = super(ValidatingUserAdmin, self).get_form(request, obj, **kwargs) 
    ###logger.debug("ValidatingUserAdmin::get_form(): about to return '{0}'".format(form)) 
    return form 


admin.site.unregister(User) 
admin.site.register(User, ValidatingUserAdmin) 

そしてforms.py:あなたはclean_is_staff方法で

def clean_is_staff(self): 
    value = self.cleaned_data["is_staff"] 
    # do code here to check for a Profile object for this user. 
    return value 

答えて

1

class ValidatingUserAdmin(admin.ModelAdmin): 
    form = ValidatingUserChangeForm 
    ... 

admin.site.unregister(User) 
admin.site.register(User, ValidatingUserAdmin) 

ます削除することができますモデル管理クラス(formの設定で十分です)とフォームクラス(フォームにはget_formメソッドが必要ありません)のを使用してください。

+0

あなたは私の問題を解決しました。ありがとう。 –

2

あなたが追加したいようにあなたが新しいフィールド 'clean_is_staff' を所有しているようですユーザーモデル。 AbstractUserを継承し、現在のUserモデルを上書きします。あなたのカスタムフォームを使用するようにモデルの管理クラスを指示する必要があり

views.py

class User(AbstractUser): 

     email = models.EmailField(null=True, blank=True) 
     mobile = models.BigIntegerField(null=True, unique=True) 
     clean_is_staff = models.BooleanField(default=False) 
     ... 

admin.py

class AccountUserAdmin(UserAdmin): 
    fieldsets = UserAdmin.fieldsets + (
     ('Info', {'fields': ('mobile', 'email', 'clean_is_staff',)}), 
    ) 

admin.site.register(User, AccountUserAdmin) 
+0

ありがとうございます。今修正されました。 –

0

'self'パラメータを追加するのを忘れ

class ValidatingUserChangeForm(UserChangeForm): 
""" 
The goal of overriding Django's UserChangeForm is 
to keep the Application Stats report correct. 

I hope this is the way to provide custom 'clean_is_staff()' service. 
The rule I want to enforce is that a registered user cannot be 
given 'is_staff' permissions. 
""" 

def __init__(self, *args, **kwargs): 
    super(ValidatingUserChangeForm, self).__init__(*args, **kwargs) 

def clean_is_staff(self): 
    value = self.cleaned_data["is_staff"] 
    # do code here to check for a Profile object for this user. 
    return value 

def get_form(self, request, obj=None, **kwargs): 
    form = super(ValidatingUserChangeForm, self).get_form(request, obj, **kwargs) 
+0

あなたの例が書かれているようにこれはうまくいくかもしれませんが、私が望むものではありません。 ContribChildFormがcontrib.auth.forms.UserChangeFormにすでに存在しています。 'is_staff'はそのフォームの既存のフィールドです。 私は、既存のis_staffフィールドで行う検証を変更/拡張したいだけです。 –

関連する問題