[Fixed]-How to get admin inline name or how to define which inline is changed?

1๐Ÿ‘

โœ…

# forms
class UserFieldForm(forms.ModelForm):
    user_use = forms.BooleanField(widget=forms.HiddenInput(), initial=True, required=True)

    def clean(self):
        m = super(UserFieldForm, self).clean()

        if m['DELETE'] is True:
            m['user_use'] = False

        return m

class TeamFieldForm(forms.ModelForm):
    team_use = forms.BooleanField(widget=forms.HiddenInput(), initial=True, required=True)

    def clean(self):
        m = super(TeamFieldForm, self).clean()

        if m['DELETE'] is True:
            m['team_use'] = False

        return m


# admin
class UsersInlineAdmin(GenericTabularInline):
    model = CTSportsToCriterias
    form = UserFieldForm

class TeamsInlineAdmin(GenericTabularInline):
    model = CTSportsToCriterias
    form = TeamFieldForm


class CriteriaGroupsAdmin(admin.ModelAdmin):
    inlines = [CriteriaTranslationsInlineAdmin, UsersInlineAdmin, TeamFieldForm]

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)

        for obj in formset.deleted_objects:
            if isinstance(instance, CTSportsToCriterias):
                is_user_use_form = obj.user_use
                is_team_use_form = obj.team_use

                # There is just one option in DB (user_use or team_use), so delete obj from DB
                if not is_user_use_form and not is_team_use_form:
                    obj.delete()

                else:
                    user_n_team = CTSportsToCriterias.objects.get(
                        object_id=obj.object_id, content_type=obj.content_type, criteria_group=obj.criteria_group)

                    # Means 'user_use' exists and we need to change 'team_use' to False
                    if is_user_use_form:
                        user_n_team.team_use = False

                    # Means 'team_use' exists and we need to change 'user_use' to False
                    elif is_team_use_form:
                        user_n_team.user_use = False

                    user_n_team.save()

        # Saves user_use + team_use in one row as there is no need to use 2 DB rows for each case (user\team)
        # if user_use or team_use already exists in DB, or just creates a new row.
        for instance in instances:
            if isinstance(instance, CTSportsToCriterias):
                content_type = ContentType.objects.get(id=instance.content_type_id)
                criteria_group = CriteriaGroups.objects.get(id=instance.criteria_group_id)

                qs_kwargs = dict(content_type=content_type, object_id=instance.object_id, criteria_group=criteria_group)

                is_user_use = instance.user_use
                is_team_use = instance.team_use

                if is_user_use:
                    qs_kwargs.update(defaults=dict(user_use=is_user_use))
                if is_team_use:
                    qs_kwargs.update(defaults=dict(team_use=is_team_use))

                CTSportsToCriterias.objects.update_or_create(**qs_kwargs)

Leave a comment