Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Admin - Validating inlines together with main models

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.

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.

like image 300
Andrea Avatar asked Jul 13 '11 15:07

Andrea


1 Answers

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
like image 68
sacabuche Avatar answered Sep 20 '22 15:09

sacabuche