Django Admin - проверка встроенных функций вместе с основными моделями - PullRequest
4 голосов
/ 13 июля 2011

У меня достаточно сложное требование проверки, и я не могу заставить администратора 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() формы - но там у меня нет информации о профилях, так как эта информация предоставляется через встроенные строки.

1 Ответ

7 голосов
/ 14 июля 2011

1

хорошо, я смотрел вокруг, как все это работает, и я нашел один вопрос, очень похожий здесь .

2

Есть один способ получить все данные одновременно, возможно, с этим вы найдете ответ на свою проблему

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
...