У меня достаточно сложное требование проверки, и я не могу заставить администратора Django удовлетворить его.
У меня есть основная модель (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()
У меня нет доступа к данным, размещенным внутри строк. Поэтому я могу определить, входит ли пользователь в группу Foo, проверяя self.cleaned_data['groups']
, но у меня нет возможности определить, был ли передан FooProfile
.
Как проверить это требование проверки?
Изменить:
Я пытаюсь объяснить проблему лучше, потому что в ответе было неверное понимание.
У меня проблема при создании нового пользователя. Дело в том, что анкеты являются обязательными (по группам). Скажем, администратор создает нового пользователя; затем я должен добавить строки в форме администратора для различных групповых профилей.
Как проверить, что правильные профили не равны нулю? Я не могу использовать метод clean()
модели User
, потому что там я не могу проверить, к каким группам принадлежит пользователь: он еще не был создан.
Я могу получить доступ только к информации о группах в методе clean()
формы - но там у меня нет информации о профилях, так как эта информация предоставляется через встроенные строки.