django custom model admin get current request in get_urls method

469 Views Asked by At

I am trying to implement a django solo kind of custom model admin where each user has his own solo object to change. So the instance id should change when user logs in admin panel. Change view is working fine but after changing the field & save, it is not saving the changes. Below is my custom ModelAdmin code -

class DatabaseSessionModelAdmin(admin.ModelAdmin):
    form = DatabaseSessionForm

    def get_queryset(self, request):
        return self.model.objects.filter(user=request.user)

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def get_urls(self):
        urls = super(DatabaseSessionModelAdmin, self).get_urls()

        if not settings.DB_ADMIN_SKIP_OBJECT_LIST_PAGE:
            return urls
        try:
            model_name = self.model._meta.model_name
        except AttributeError:
            model_name = self.model._meta.module_name.lower()
        self.model._meta.verbose_name_plural = self.model._meta.verbose_name
        url_name_prefix = '%(app_name)s_%(model_name)s' % {
            'app_name': self.model._meta.app_label,
            'model_name': model_name,
        }
        custom_urls = [
            re_path(r'^$',
                    self.admin_site.admin_view(self.change_view),
                    # {'object_id': str(self.singleton_instance_id)},
                    name='%s_change' % url_name_prefix),
        ]
        return custom_urls + urls

    def response_change(self, request, obj):
        msg = _('%(obj)s was changed successfully.') % {
            'obj': force_str(obj)}
        if '_continue' in request.POST:
            self.message_user(request, msg + ' ' +
                              _('You may edit it again below.'))
            return HttpResponseRedirect(request.path)
        else:
            self.message_user(request, msg)
            return HttpResponseRedirect("../../")

    def change_view(self, request, object_id=None, form_url=None, extra_context=None):
        object_id = DatabaseSession.objects.filter(user=request.user).first().id

        if not extra_context:
            extra_context = dict()
        extra_context['skip_object_list_page'] = True

        return super(DatabaseSessionModelAdmin, self).change_view(
            request,
            str(object_id),
            form_url=form_url,
            extra_context=extra_context,
        )

    def history_view(self, request, object_id, extra_context=None):
        object_id = DatabaseSession.objects.filter(user=request.user).first().id

        if not extra_context:
            extra_context = dict()
        extra_context['skip_object_list_page'] = settings.DB_ADMIN_SKIP_OBJECT_LIST_PAGE

        return super(DatabaseSessionModelAdmin, self).history_view(
            request,
            str(object_id),
            extra_context=extra_context,
        )

So, I tried to solve this in many ways, but nothing's working. In my thoughts, if I can get the current user or request in get_urls method, that might lead to a solution. I tried crum libray, django-current-user, even implemented my own middleware, but all failed. Please help me resolve this or suggest me any workarounds please. Thanks in advance.

0

There are 0 best solutions below