Search code examples
pythondjangodjango-tables2

DjangoTables2 Add column from another model


I have DjangoTable for this model:

class Mark(models.Model)
    id_mark = models.AutoField(primary_key=True, verbose_name='Id запису')
    id_student = models.ForeignKey(Student, blank=False, null=False, default=None, on_delete=models.CASCADE,verbose_name='Студент')
    id_subject = models.ForeignKey(Subject, blank=False, null=False, default=None, on_delete=models.CASCADE,verbose_name='Предмет')
    mark = models.DecimalField(decimal_places=3, max_digits=5, blank=False, null=False, default=None, verbose_name='Оцінка')

    class Meta:
        verbose_name = 'Оцінка'
        verbose_name_plural = 'Оцінки'

    def __str__(self):
       return "{} {} {}".format(self.id_student, self.id_subject, self.mark)

Table:

class Mark_Table(tables.Table):
    class Meta:
         model = Mark
         exclude = ('id_mark',)
         attrs = {'class': 'paleblue'}

I want to add column with values from this model:

class Subject(models.Model)
    id_subject = models.AutoField(primary_key=True, verbose_name='Id предмету')
    id_teacher = models.ForeignKey(Teacher, blank=False, null=False, default=None, on_delete=models.CASCADE,verbose_name='Вчитель')
    name = models.CharField(max_length=32, blank=False, null=False, default=None, verbose_name='Назва предмету')

    class Meta:
        verbose_name = 'Предмет'
        verbose_name_plural = 'Предмети'

    def __str__(self):
        return "{}".format(self.name)

Now I have fields Student Subject Mark, I want to add filed id_teacher from another model, and relationship must remain.


Solution

  • You can add foreign key value in table using table.Coulmn() and specifying accessor like below:

    id_teacher = tables.Column(accessor='id_subject.id_teacher')
    

    So your Mark_Table will look like:

    class Mark_Table(tables.Table):
        # Define all the custom fields here including any override or adding other fields and include it in fields in meta class
        id_teacher = tables.Column(accessor='id_subject.id_teacher')
    
        class Meta:
             model = Mark
             fields = ['mark', 'id_teacher']  # specify all the fields you want to display here
             attrs = {'class': 'paleblue'}
    

    Read more about adding custom field at docs