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