我是Django的新手,我正在构建一个以表格格式显示模型信息的网页。我发现了一个非常有用的库 - django-tables2,这使得构建html表变得非常简单。
但是,我无法弄清楚如何自定义其中一个表列的呈现。具体来说,我想要一个链接列(我认为它是使用LinkColumn或django_tables2中的URLColumn实现)来渲染到
<a href="http://example.com">Personal Webpage</a>
而不是django_tables2方式,其中链接名称默认为链接url。
<a href="http://example.com">http://example.com</a>
这个逻辑属于哪个 - 在模型中,在视图中还是在模板中?
# models.py
class Person(models.Model):
...
personal_webpage = models.URLField()
#personal_webpage = models.URLField(display_link_name = "Personal Webpage") # is something like this possible at the model level?
# table.py
import django_tables2
import my_app.models import Person
class PersonTable(django_tables2.Table):
class Meta:
model = Person
#personal_webpage = URLColumn(url_name = "Personal Webpage") # is something like this possible?
# views.py
from django.shortcuts import render
from django_tables2 import RequestConfig
from my_app.models import Person
from my_app.table import PersonTable
def personal_page_view(request):
table = PersonTable(Person.objects.all())
RequestConfig(request).configure(table)
return render(request, "my_app/personal_webpage.html", {"table": table})
#personal_webpage.html
{% load render_table from django_tables2 %}
<!doctype html>
<html>
...
<body>
...
{% render_table table %}
</body>
</html>
我尚未查看django / django_tables2源代码,希望有些人会有建议。
更新:我搜索了更多的解决方案,找到了一个建议的解决方案:
#tables.py
class CustomTextLinkColumn(django_tables2.LinkColumn):
def __init__(self, viewname, urlconf=None, args=None,
kwargs=None, current_app=None, attrs=None, custom_text=None, **extra):
super(CustomTextLinkColumn, self).__init__(viewname, urlconf=urlconf,
args=args, kwargs=kwargs, current_app=current_app, attrs=attrs, **extra)
self.custom_text = custom_text
def render(self, value, record, bound_column):
return super(CustomTextLinkColumn, self).render(self,
self.custom_text if self.custom_text else value,
record, bound_column)
class PersonTable(django_tables2.Table):
webpage_link = CustomTextLinkColumn('my_app.views.personal_page_view', args=[A('personal_webpage')],
custom_text='Personal Webpage', verbose_name='Personal Webpage', )
但它似乎不起作用。该列会被渲染,但该列的单元格不包含&#34;个人网页&#34;,而是&#34; ---&#34;。
答案 0 :(得分:0)
有点迟到的答案,但您应该像这样更改PersonTable
课程:
class PersonTable(django_tables2.Table): personal_webpage = CustomTextLinkColumn('my_app.views.personal_page_view', args=[A('personal_webpage')], custom_text='Personal Webpage', verbose_name='Personal Webpage', ) class Meta: model = Person
要记住的重要(并且不是很清楚)事情是“仅当确定单元格的值不是空值时才调用渲染方法”。由于您的模型没有webpage_link字段或属性,因此没有赋予它的值。因此,您可以按照我的建议将名称更改为personal_webpage
,或者按照此问题的答案中的建议将empty_values=()
传递给您的列初始化:Django Tables adding a LinkColumn / NoReverseMatch Error