开发者

Django Admin - Validating inlines together with main models

开发者 https://www.devze.com 2023-03-19 20:35 出处:网络
I have quite a complex validation requirement, and I cannot get Django admin to satisfy it. I have a main model (django.contrib.auth.models.User) and several models which look like

I have quite a complex validation requirement, and I cannot get Django admin to satisfy it.

I have a main model (django.contrib.auth.models.User) and several models which look like

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

I want to check that, if the user belongs to some group, then it has the corresponding profile. So if user is in group Foo he should have a non empty FooProfile.

Where do I put this validation rule? I cannot put it in the model. Indeed, the user is not created yet when the form is validated, hence I cannot access his groups. So I need to resort to form validation. This is what I put:

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)

My problem is that inside UserAdminForm.clean() I do not have access to the data posted inside the inlines. So I can tell whether the user is in group Foo by inspecting self.cleaned_data['groups'], but I have no way to tell whether a FooProfile was transmitted开发者_JAVA技巧.

How do I check this validation requirement?

Edit:

I try to explain the issue better, because there has been a misunderstading in an answer.

I have an issue when I create a new user. The fact is that the profiles are mandatory (according to the groups). Say an admin creates a new user; then I have to add inlines in the admin form for the various GroupProfiles.

How do I check that the right profiles are not null? I cannot use the clean() method of the User model, because in there I cannot check what groups the user belongs to: it has not been created yet.

I can only access the information about the groups in the clean() method of the form - but there I do not have the information about the profiles, since this information is submitted trhough inlines.


1

well i have been looking around, how all this stuff works, and i found one question very similar here.

2

There are one way to get all the data at the same time maybe with this you can find the answer to your problem

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

精彩评论

暂无评论...
验证码 换一张
取 消