В Django Tables2 как сделать так, чтобы в колонке отображался текст из таблицы, на которую ссылается внешний ключ?

После прочтения всех документов и ответов, которые я смог найти, и сжигания целого дня, я все еще не могу заставить это работать. Используя Django Tables2, я хочу показать список инструментов; таблица instruments включает внешний ключ к таблице instrumentsType. Когда я перечисляю инструменты и их атрибуты, я хочу использовать внешний ключ для подстановки текстового описания типа инструмента из другой таблицы. Я перепробовал все комбинации двойных подчеркиваний и других методов доступа, но пока все, что я получаю, это ужасный -- в столбце. (Отображение только ID записи работает).

from .models import Instrument
from django_tables2 import A
from instrumenttypes.models import InstrumentType

class InstrumentTable(tables.Table):
    id = tables.LinkColumn('instrument_details', args=[A('station_id')])

    class Meta:
        model = Instrument
        template_name = "django_tables2/bootstrap.html"
        fields = ("id", "instrument", "nickname", "serialNo",
           "instrument__instrumenttype_id__instrumenttypes__id_instrumentType" )

Задействованы следующие модели: Instruments model.py

from django.db import models

from instrumenttypes.models import InstrumentType
from stations.models import Station

# Create your models here.
class Instrument(models.Model):
    instrument = models.CharField(max_length=40)
    instrumenttype = models.ForeignKey(InstrumentType, on_delete=models.CASCADE, null=True)
    station = models.ForeignKey(Station, on_delete=models.CASCADE, default=1)
    serialNo = models.CharField(max_length=60, null=True, blank=True)
    dateAdded = models.DateTimeField("Date Added", null=True, blank=True)
    dateRemoved = models.DateTimeField("Date Removed", null=True, blank=True)
    status = models.CharField(max_length=10, null=True, blank=True)
    nickname = models.CharField(max_length=40, null=True, blank=True)

InstrumentTypes model.py

from django.db  import models

class InstrumentType(models.Model):
    instrumentType = models.CharField(max_length=40)

Результат вывода:

ID  Instrument  Nickname    SerialNo    Instrumenttype
4   instr2       nock2       123           —

Наиболее подходящие ссылки в Интернете, которые я нашел, - здесь и здесь; но, попробовав предложенные варианты, ничего не получилось. Что я упускаю?

Я тоже боролся за то, чтобы заставить что-то работать (но в конце концов я это сделал), и я нашел примеры слишком краткими.

Думаю, вы хотите избавиться от этого материала в классе Meta

"instrument__instrumenttype_id__instrumenttypes__id_instrumentType" 

И использовать :

from django_tables2.utils import Accessor

    class InstrumentTable(tables.Table):
            instrument_type = tables.Column(accessor=Accessor('instrumenttype.name'))
            
            class Meta:
                model = Instrument
                template_name = "django_tables2/bootstrap.html"
                fields = ("id", "instrument", "nickname", "serialNo", "insrument_type")

(строчные буквы, точечная нотация, это путь к нужному атрибуту, начиная с экземпляра Instrument). Затем в представлении создайте экземпляр InstrumentTable

def myview(request):
    table_to_render = InstrumentTable(Instrument.objects)
    return render(request, sometemplate, {table: table_to_render})

Вы не показали свой вид, и я знаю, что может быть другой способ. Если у вас есть все это где-то в репозитории, оставьте ссылку.

Вернуться на верх