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)
Source:stackexchange.com