Last active
December 6, 2019 12:34
-
-
Save LowerDeez/1222513f0ed0acf2c1b4a64f5ad3f603 to your computer and use it in GitHub Desktop.
Django. Sinleton admin mixin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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