2011-07-13 14 views
4

私は非常に複雑な検証要件があります。私はDjangoの管理者にそれを満たすことができません。Django Admin - メインモデルと一緒にインラインを検証する

私がメインモデル(django.contrib.auth.models.User)と私は、ユーザーがいくつかのグループに属している場合、それは対応するプロファイルを持っている、ことを確認したい

class SomeProfile(models.Model): 
    user = models.OneToOneField(User) 
    # more fields 

のように見えるいくつかのモデルを持っています。したがって、ユーザがグループFooにいる場合、彼は空ではないFooProfileを持つ必要があります。

この検証ルールはどこに置かれますか?私はそれをモデルに入れることはできません。実際、フォームが検証された時点でユーザーはまだ作成されていないため、彼のグループにアクセスすることはできません。だから私はフォーム検証に頼る必要があります。これは私が入れたものです:

class UserAdminForm(forms.ModelForm): 
    """ 
    A custom form to add validation rules which cannot live in the 
    model. We check that users belonging to various groups actually 
    have the corresponding profiles. 
    """ 
    class Meta: 
     model = User 

    def clean(self): 
     # Here is where I would like to put the validation 

class FooInline(admin.TabularInline): 
    model = FooProfile 
    max_num = 1 


class UserAdmin(admin.ModelAdmin): 
    model = User 
    form = UserAdminForm 
    inlines = [FooInline] 

admin.site.register(User, UserAdmin) 

私の問題はUserAdminForm.clean()の内側に、私はインラインの内側にポストされたデータへのアクセスを持っていないということです。だから私はself.cleaned_data['groups']を検査してユーザがグループFooにいるかどうかを知ることができますが、FooProfileが送信されたかどうかを判断する方法はありません。

この確認の要件を確認するにはどうすればよいですか?

編集:

私は答えでmisunderstadingがあったので、より良い問題を説明しよう。

新しいユーザーを作成すると問題が発生します。実際、プロファイルは必須である(グループ別)。管理者が新しいユーザーを作成したとします。さまざまなGroupProfilesの管理フォームにインラインを追加する必要があります。

正しいプロファイルがヌルでないことを確認する方法を教えてください。 Userモデルのclean()メソッドを使用することはできません。そこでは、ユーザーが所属するグループを確認できないため、まだ作成されていません。

フォームのclean()メソッドのグループに関する情報にしかアクセスできませんが、この情報はtrhoughインラインで送信されるため、プロファイルに関する情報はありません。

答えて

7

さて、私はこのすべてのものがどのように働くか、周りを探してきた、と私はhere一つの質問は非常に類似しました。

は多分これであなたは、私はこれが問題をどのように変化するかを確認していない、あなたの問題

class UserAdminForm(forms.ModelForm): 
    """ 
    A custom form to add validation rules which cannot live in the 
    model. We check that users belonging to various groups actually 
    have the corresponding profiles. 
    """ 
    class Meta: 
     model = User 

    def clean(self): 
     self.data # <--here is all the data of the request 
     self.data['groups'] 
     self.data['profile_set-0-comments'] # some field 
     # some validations 

     return self.cleaned_data 
+0

に対する答えを見つけることができると同時に、すべてのデータを取得するための一つの方法があります。私はまだ新しいユーザーを作成するときに問題があります。私は問題をよりよく説明するために答えを編集しました。見てください。 GroupProfilesを共通のプロファイルに関連づけても、UserではなくProfileモデルで作業することを除いて、問題は変わりません。私はまだ管理者によって作成された新しいユーザーを検証する方法を知らない。 – Andrea

+0

私の答えが変わった – sacabuche

関連する問題