4

私は Django を初めて使用し、モデルの情報を表形式で表示する Web ページを作成しています。私は非常に便利なライブラリを発見しました - django-tables2 は、HTML テーブルの構築を非常に簡単にします。

ただし、テーブル列の 1 つのレンダリングをカスタマイズする方法がわかりません。具体的には、リンク列 (django_tables2 の LinkColumn または URLColumn を使用して実装されていると思います) をレンダリングする必要があります。

<a href="http://example.com">Personal Webpage</a>

リンク名がデフォルトでリンクURLであるdjango_tables2の方法の代わりに。

<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', )

しかし、うまくいかないようです。列はレンダリングされますが、列のセルには「個人用 Web ページ」が含まれておらず、代わりに「---」が含まれています。

4

1 に答える 1

0

少し遅い答えですが、PersonTableクラスを次のように変更する必要があります。

クラス PersonTable(django_tables2.Table):
    personal_webpage = CustomTextLinkColumn('my_app.views.personal_page_view',
        args=[A('personal_webpage')], custom_text='パーソナル ウェブページ',
        verbose_name='個人のウェブページ', )

    クラスメタ:
        モデル=人

覚えておくべき重要な (そしてあまり明確ではない) ことは、「セルの値が空の値ではないと判断された場合にのみ、render メソッドが呼び出される」ということです。モデルには webpage_link フィールドまたは属性がないため、値が指定されていません。したがって、私が提案するように名前を変更するか、この質問への回答で提案されているように列の初期化にpersonal_webpage渡すことができます: Django Tables added a LinkColumn / NoReverseMatch Errorempty_values=()

于 2013-12-17T16:51:45.653 に答える