【问题标题】:django: django-tables2 DetailView CBV won't display single objectdjango:django-tables2 DetailView CBV 不会显示单个对象
【发布时间】:2016-01-22 11:04:06
【问题描述】:

我有一张桌子

import django_tables2 as tables
from .models import Account
from django_tables2.utils import A  # alias for Accessor


class AccountTable(tables.Table):
    nickname = tables.LinkColumn('accounts:detail', args=[A('pk')])

    class Meta:
        model = Account
        attrs = {'class': 'table table-striped table-hover'}
        exclude = ("created", "modified", "destination")

一个视图:

class DetailView(SingleTableMixin, generic.DetailView):

    template_name = 'accounts/account_detail.html'
    context_table_name = 'table'
    model = Account
    table_class = AccountTable
    context_object_name = object

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(DetailView, self).dispatch(*args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(DetailView, self).get_context_data(object=self.object)
        context['title'] = 'Account Detail'
        context['pk'] = self.kwargs.get(self.pk_url_kwarg, None)
        return context

还有一个模板:

<!DOCTYPE html>
{% extends "accounts/base.html" %}
{% load django_tables2 %}
{% load render_table from django_tables2 %}
<title>Account Detail</title>

{% block content %}
<br>
<br>
<h1>{{ object.id }}  :  {{object.nickname}}</h1>

<div> 
{% render_table table %}    
</div>
{% endblock %}

它正确地获取对象 pk 和所有内容,但不会只发送一个对象来填充表。我知道它得到了对象,因为 object.id 和 object.nickname 都正确显示。我知道可以只显示一个特定的对象,因为我在同一个项目中有另一个应用程序,如果您单击将您带到 DetailView 的链接(我借用该模板以使用我的 Account 模型重新创建),该应用程序仅显示一个对象)。但它只会显示所有对象的表格。

如有必要,我可以提供请求数据。我可以向你保证,我已经在模板上下文中看到了该对象,并且确实它必须是,否则 object.id 将不起作用。 django-tables2 的诀窍是什么?显然我已经做过一次了!

【问题讨论】:

    标签: python django django-tables2 detailview


    【解决方案1】:

    您可以覆盖视图的get_table_data 方法,并返回要显示的对象列表。

    在这种情况下,您需要一个只有一项的列表,即来自DetailView 的对象。

    def get_table_data(self):
        return [self.object]
    

    【讨论】:

    • 当我尝试不带括号时出现此错误:“数据必须类似于 QuerySet(具有计数和 order_by)或支持列表(数据)——帐户两者都没有。”然后我看到你有一个支架并且它有效。谢谢!
    • 括号是必需的,因为 django-tables2 期望 get_table_data 返回像查询集或列表这样的可迭代对象,而不是单个对象。
    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 2020-04-30
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多