Skip to content

Instantly share code, notes, and snippets.

@LowerDeez
Last active December 6, 2019 12:34
Show Gist options
  • Save LowerDeez/1222513f0ed0acf2c1b4a64f5ad3f603 to your computer and use it in GitHub Desktop.
Save LowerDeez/1222513f0ed0acf2c1b4a64f5ad3f603 to your computer and use it in GitHub Desktop.
Django. Sinleton admin mixin
class SingleObjectAdminModelMixin(AdminCharCountMixin):
list_display = ('page_name',)
def has_delete_permission(self, request, obj=None):
"""
Forbid object deleting
"""
return True
def page_name(self, obj):
"""
Displaying model verbose name as single-object name
:param obj:
:return:
"""
return obj._meta.verbose_name
def get_object_info(self):
"""
Getting app name and model name to build urls for adding and changing single object
:param obj: page object
:return: name of app, name of model
"""
name = self.model._meta.model_name
app_name = self.model._meta.app_label
return name, app_name
# taken from preferences app
def changelist_view(self, *args, **kwargs):
"""
Redirects on changelist_view get request.
If no object - to create page
Otherwise - to change page of some object
"""
obj = self.model.objects.only('id').first()
if not obj:
obj = self.model.objects.create()
name, app_name = self.get_object_info()
return HttpResponseRedirect(
reverse('admin:{}_{}_change'.format(app_name, name), args=[obj.id])
)
def response_change(self, request, obj, post_url_continue=None):
"""
Redirects after object's change to its change page
Actually it's just a reload
"""
name, app_name = self.get_object_info()
return HttpResponseRedirect(
reverse('admin:{}_{}_change'.format(app_name, name), args=[obj.id])
)
def response_add(self, request, obj, post_url_continue=None):
"""
Redirects to the change page of the created object.
Does not allow to add new objects.
If user clicks on "Save and add another", we just redirect to change view
"""
name, app_name = self.get_object_info()
return HttpResponseRedirect(
reverse('admin:{}_{}_change'.format(app_name, name), args=[obj.id])
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment