我正在使用django-tables 2呈现一个查询集,但由于该表是立即呈现的,我无法管理以下内容:首先,我应该提到表的行数因每个查询集而不同所以我不这样做事先知道它们的确切数量.我需要的是每行一个按钮,将检索到的对象加载到表单的字段中.我用默认方式渲染表:
{% load render_table from django_tables2 %}
{% render_table table %}
Run Code Online (Sandbox Code Playgroud)
当我尝试迭代表的行时,我得到错误'table is is iterable'.那么如何每行添加一个按钮呢?
我已经搜索过这个,但没有太多的运气,所以寻求一些帮助.我正在尝试使用模型中的函数定义向模型定义的表中添加一些额外的列.这是我的代码现在的样子:
# models.py
class MyModel(models.Model):
my_field = models.TextField()
def my_function(self):
# Return some calculated value based on the entry
return my_value
# tables.py
class MyTable(tables.Table):
my_extra_column = tables.Column(....)
class Meta:
model = MyModel
# views.py
table = MyTable(MyModel.objects.all())
RequestConfig(request).configure(table)
return render(request, ....)
Run Code Online (Sandbox Code Playgroud)
我的问题是我可以my_function在传入的条目中访问,MyTable以便我可以my_function在自定义my_extra_column列中显示结果吗?我假设我需要使用访问器,但我无法看到如何使用它来访问查询集数据.谢谢!
我已经将范围缩小到以下内容,如果有人可以帮助我指出如何将以下内容转换为表格视图,那就太棒了。以下html是从base.html扩展而来的
{% block page_content %}
<h1>Projects</h1>
<div class="row">
{% for project in projects %}
<div class="col-md-4">
<div class="card mb-2">
<img class="card-img-top" src="{% static project.image %}">
<div class="card-body">
<h5 class="card-title">{{ project.title }}</h5>
<p class="card-text">{{ project.description }}</p>
<a href="{% url 'project_detail' project.pk %}"
class="btn btn-primary">
Read More
</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
需要在 gridview 中显示数据的帮助。我对这一切都很陌生。我可以从 mongodb 读取并显示页面上的数据,但需要显示在表格中。
现在对我来说百万美元的问题是我应该在代码中调整以下代码片段以提供 gridview
<table>
<tr>
<th>Field 1</th>
<th>Field N</th>
</tr>
{% for item in query_results %}
<tr>
<td>{{ item.field1 }}</td> …Run Code Online (Sandbox Code Playgroud) 我已声明了一个表,并希望获取行的值,该值使用checkboxfield进行检查.任何帮助,我如何在我的视图中编写此事件,以便每次我选择一行并点击提交按钮,它返回行的值.代码如下所示:
class mytables(tables.Table):
new_database = tables.CheckBoxColumn()
student =tables.Column(accessor='Student')
Class = tables.Column(accessor='class')
Run Code Online (Sandbox Code Playgroud)
在我的模板中有一个提交按钮.
在一个简单的django-tables2中如何在特定单元格中渲染1个colum的图像....
有些喜欢
field1 field2 field3 . . .
Run Code Online (Sandbox Code Playgroud)
row1 A image1 C
row2 B image2 D.
...
因此,对于Django项目,我真的希望能够动态地生成和显示表(不基于查询集),而无需事先知道内容或模式.
看起来django-tables2应用程序为呈现表提供了很好的功能,但它要求您通过在自定义的Table子类上声明属性来显式声明列名,或者为它提供推断列的模型.
即,要使用名为"name"的列,您可以:
class NameTable(tables.Table):
name = tables.Column()
Run Code Online (Sandbox Code Playgroud)
Tables类没有提供事后添加列的方法,因为从读取源代码开始,它似乎使用了一个元类来清除__new__上的类属性并锁定它们.
看起来非常简单的元编程将是一个优雅的解决方案.我定义了一个接受列名为参数的基类工厂:
def define_table(columns):
class klass(tables.Table): pass
for col in columns:
setattr(klass, col, tables.Column())
return klass
Run Code Online (Sandbox Code Playgroud)
可悲的是,这不起作用.如果我跑'
x = define_table(["foo", "bar"])(data)
x.foo
x.bar
Run Code Online (Sandbox Code Playgroud)
我回来了:
<django_tables2.columns.base.Column object at 0x7f34755af5d0>
<django_tables2.columns.base.Column object at 0x7f347577f750>
Run Code Online (Sandbox Code Playgroud)
但是,如果我列出列:
print x.base_columns
Run Code Online (Sandbox Code Playgroud)
我什么都没回来,即{}
我意识到可能有更简单的解决方案(例如只是咬紧牙关并在代码中定义每个可能的数据配置,或者不使用django-tables2并自己动手),但我现在将此视为一个了解更多信息的机会元编程,所以我真的想以这种方式工作.
知道我做错了什么吗?我的理论是__new__方法(在元类表使用中重新定义)在定义klass时被调用,而不是在实例化时调用,所以当我对属性进行处理时,为时已晚.但这违反了我对__new__何时应该发生的理解.否则,我很难理解元类__new__如何区分定义代码属性与动态定义属性之间的区别.
谢谢!
我目前正在使用django-tables2显示数据集.
文档没有特别提到这一点,所以我猜这可能会占用一些表 - 但是,我希望有人已经完成了这一点.
如何使用表格下方的django-tables2呈现页码?我希望能够显示的是用户可以单击的页码的水平列表.
提前致谢.
我有一个由django-tables2生成的工作表:
my_filter = TestFilter(request.POST)
table = TestTable(TestObj.objects.all(), order_by="-my_date")
RequestConfig(request, paginate={"per_page": 10}).configure(table)
return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个包含数百个对象的表,这些对象整齐地分页,每页有10个项目.当我点击表格底部的"下一步"时,分页效果很好,我可以浏览不同的页面.但是,我注意到以下行为:
my_filter其上显示原始未过滤表的子集my_filter再次单击将显示已过滤表的第二页我希望过滤器在导航不同页面时保持不变.我在这里发现了类似的问题.该解决方案表明需要更改html代码.但是,在我的情况下,django-tables2正在生成html.
如何使用django-tables2正确实现过滤分页?
-Update-
我尝试过使用GET而不是POST:
if request.method == 'GET':
my_filter = TestFilter(request.GET)
my_choice = my_filter.data['my_choice']
table = TestTable(TestObj.objects.filter(choice=my_choice), order_by="-my_date")
RequestConfig(request, paginate={"per_page": 10}).configure(table)
return render(request, 'test_app/index.html', {'table': table, 'my_filter': my_filter})
Run Code Online (Sandbox Code Playgroud)
我的模板:
<form action="" method="get"> {% csrf_token %}
{{ my_filter }} <input type="submit" value="Apply Filter"/>
</form>
Run Code Online (Sandbox Code Playgroud)
由于my_choiceGET中不存在KeyError,因此会导致KeyError .结果页面甚至没有加载.
我正在尝试使用django-tables2在表的第一列上添加一个计数器,但是下面的解决方案仅在#列下显示全0。我应该如何添加一列,该列将为行编号?
table.py:
import django_tables2 as tables
from profiles.models import Track
import itertools
counter = itertools.count()
class PlaylistTable(tables.Table):
priority = tables.Column(verbose_name="#", default=next(counter))
class Meta:
model = Track
attrs = {"class": "paleblue"}
orderable = False
fields = ('priority', 'artist', 'title')
Run Code Online (Sandbox Code Playgroud)
我的模板:
{% render_table table %}
Run Code Online (Sandbox Code Playgroud) 网站通常允许用户指定分页表中每页显示的项目数。我想用 django-tables2 来做到这一点。
我可以添加一个“每页显示 [ 5 | 10 | 50 ]”选择框来收集用户的 per_page 参数。
但是,表模板中的“上一页”和“下一页”按钮是超链接,具有 per_page 的硬编码值,例如:
<a href="?per_page=5&page=5">Next</a>
Run Code Online (Sandbox Code Playgroud)
我认为实现这种动态的唯一方法是使用 javascript,例如:
<span onclick="get_table_page(5)">Next</span>
Run Code Online (Sandbox Code Playgroud)
其中函数 get_table_page() 可以从选择框中检索 per_page 参数。
这是最好的方法吗?或者有没有不用javascript的方法?
更新:没有回答问题(如何更改上一页/下一页的 per_page),但是,正如接受的答案指出的那样,用户可以使用更改后的 per_page 参数重新加载当前页面,例如:
<p>Show [ <a href="{% querystring "per_page"=5 %}">5</a>
| <a href="{% querystring "per_page"=20 %}">20</a>
| <a href="{% querystring "per_page"=50 %}">50</a>
] Items</p>
Run Code Online (Sandbox Code Playgroud)
谨致谢意和良好祝愿
伊万