В 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})
Вы не показали свой вид, и я знаю, что может быть другой способ. Если у вас есть все это где-то в репозитории, оставьте ссылку.