代码之家  ›  专栏  ›  技术社区  ›  blackwindow

如何调用django-tables2中的非模型字段

  •  2
  • blackwindow  · 技术社区  · 9 年前

    我的应用程序(app1)中有几个模型。但我想从在app1中创建的djnago-tables2中的另一个应用程序(app2)中创建的模型中调用一个字段。我如何调用它?我尝试了几种方法,但都无法调用。错误表示 Cannot resolve keyword u'xyz' into field. 。请帮助

    1 回复  |  直到 9 年前
        1
  •  4
  •   AlvaroAV    9 年前

    如果您要在Django表2中使用多个模型,我建议您避免在表中定义模型,这样您的表可以是:

    class NonModelTable(tables.Table):
        name = tables.columns.TemplateColumn(template_code=u"""{{ record.name }}""", orderable=True, verbose_name='Name')
        surname = tables.columns.TemplateColumn(template_code=u"""{{ record.surname }}""", orderable=True, verbose_name='Surname')
        address = tables.columns.TemplateColumn(template_code=u"""{{ record.address }}""", orderable=True, verbose_name='Address')
    
        class Meta:
            attrs = {'class': 'table table-condensed table-vertical-center', 'id': 'dashboard_table'}
            fields = ('name', 'surname', 'address')
            sequence = fields
            order_by = ('-name', )
    

    当您这样定义表时,您可以传递一个字典列表来初始化表,但是这个字典需要有这3个字段(名称、姓氏、地址),即使它们是空的。

    你没有提供任何关于你的确切数据结构的信息,所以我发明了这个只有3个字段的表,现在要使用不同的模型初始化一个这样的表,你应该生成一个 标准 格言列表,如:

    data = []
    object_1 = YourModel.objects.all()
    for object in object_1:
       data.append({'name': object.name, 'surname': object.type, 'address': ''})
    
    object_2 = Your2ndModel.objects.all()
    for object in object_2:
       data.append({'name': object.name, 'surname': object.status, 'address': object.warehouse})
    
    table = NonModelTable(data)
    
    return render(request, 'template.html', {... 'table':table,...})
    

    当然,字段的数量是可定制的,您可以使用您希望的名称拥有任意数量的字段,但是当您初始化de table时,dict列表中的dict必须遵循表结构, 所有dict必须具有表定义中出现的所有字段

    EDIT:另一个选项

    如果不想修改表,可以使用传递给表的数据生成一个dict列表,然后按照第一个模型结构将其他模型中的数据追加:

    1. 从app1获取所有对象
    2. 生成包含表所需字段的字典列表
    3. 从app2获取所有对象
    4. 用app1模型中的相同dict键附加app2中的对象
    5. 使用初始化表 table = YourTable(data)