【问题标题】:Django: In django-tables2 how to modify the way URLField gets renderedDjango:在 django-tables2 中如何修改 URLField 的呈现方式
【发布时间】:2013-12-23 00:37:09
【问题描述】:

我是 Django 新手,我正在构建一个以表格格式显示模型信息的网页。我为自己发现了一个非常有用的库 - django-tables2,它使构建 html 表变得非常简单。

但是,我无法弄清楚如何自定义表格列之一的呈现。具体来说,我想要一个链接列(我认为它是使用 django_tables2 中的 LinkColumn 或 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', )

但它似乎不起作用。该列被渲染,但该列的单元格不包含“个人网页”,而是“---”。

【问题讨论】:

    标签: python django url django-tables2


    【解决方案1】:

    答案有点晚,但您应该像这样更改您的 PersonTable 类:

    类 PersonTable(django_tables2.Table): 个人网页 = CustomTextLinkColumn('my_app.views.personal_page_view', args=[A('personal_webpage')], custom_text='个人网页', verbose_name='个人网页', ) 元类: 模型 = 人

    要记住的重要(但不是很清楚)的事情是“只有在确定单元格的值不是空值时才会调用渲染方法”。由于您的模型没有 pages_link 字段或属性,因此没有赋予它任何值。因此,您可以按照我的建议将名称更改为 personal_webpage,或者将 empty_values=() 传递给您的 Column init,如该问题的答案中所建议的那样:Django Tables adding a LinkColumn / NoReverseMatch Error

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2013-11-19
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多