类型为'的/en/对象处的类型错误__代理';JSON不可序列化

类型为'的/en/对象处的类型错误__代理';JSON不可序列化,json,django,python-3.x,Json,Django,Python 3.x,我正试图在django项目中实现面包屑。为了证明这一点,我创建了一个mixin,它由我拥有的每个视图继承。代码如下: class BreadcrumbMixin(object): index = False url_name = None verbose_name = None def breadcrumbUpdate(self, breadcrumb, new_value): for i in range(len(breadcrumb)):

我正试图在django项目中实现面包屑。为了证明这一点,我创建了一个mixin,它由我拥有的每个视图继承。代码如下:

class BreadcrumbMixin(object):
    index = False
    url_name = None
    verbose_name = None

    def breadcrumbUpdate(self, breadcrumb, new_value):
        for i in range(len(breadcrumb)):
            if breadcrumb[i]['url_name'] == new_value['url_name']:
                breadcrumb = breadcrumb[:i + 1]
        breadcrumb.append(new_value)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        new_value = {
            'url_name' : self.url_name,
            'verbose_name' : self.verbose_name,
            'url' : reverse_lazy(self.url_name, **kwargs)
        }

        if self.index:
            self.request.session['breadcrumb'] = [new_value,]
        else:
            self.breadcrumbUpdate(self.request.session['breadcrumb'], new_value)
        return context
属性
索引
url\u名称
详细名称
在继承它的每个视图中设置。例如:

class Index(BreadcrumbMixin, TemplateView):
    template_name = 'crud/index.html'
    index = True
    url_name = 'index' # Name argument used in urls.py
    verbose_name = _('Index')
它基本上使用这些信息来创建dict列表,并使用
会话
字典将其传递给模板。在模板中,它的调用方式如下:

<div style="margin-left: 10px;">
    {% for element in request.session.breadcrumb %}
        <a href="{{ element.url }}" class="breadcrumb"> {{ element.verbose_name }} </a>
    {% endfor %}
</div>
据我所知,它无法序列化要在模板中使用的面包屑,但为什么


PS:我从未直接使用过JSON,所以我不知道如何处理它。

当使用JSONSerializer在会话对象中存储数据时,该数据必须只包含可以转换为JSON的值

在您的代码中,您使用了一些惰性对象,这就是您获得
\uuuuu代理\uuuu
的原因。在序列化之前,必须将它们转换为字符串

new_value = {
        'url_name' : self.url_name,
        'verbose_name' : str(self.verbose_name),
        'url' : str(reverse_lazy(self.url_name, **kwargs))  # or just reverse()
    }
您也可以使用或(我自己还没有尝试过,但在阅读文档时,似乎序列化程序可以处理惰性对象。)

new_value = {
        'url_name' : self.url_name,
        'verbose_name' : str(self.verbose_name),
        'url' : str(reverse_lazy(self.url_name, **kwargs))  # or just reverse()
    }