Отобразить заблуждение в django-таблицах2 - PullRequest
0 голосов
/ 25 января 2019

После создания пользовательской модели в моем приложении у меня есть studentProfile, который наследуется от пользовательской модели, которая также содержит аватар, семестр и dept_name.который отлично работаетОднако, когда я пытался отобразить эти данные studentProfile с использованием django-tables2, все строки продолжают отображать «-», и полученный идентификатор взят из пользовательской модели, а не studentProfile.

Самое странное, что я могу правильно получить все значения из пользовательской модели, даже когда studentProfile - моя табличная модель для django-tables2

Я не знаю, что яя делаю неправильноЛюбая помощь очень ценится

мои определения модели следующие:

class DepartmentData(models.Model):
    fid = models.ForeignKey(FacultyData, on_delete=models.CASCADE)
    dept_name = models.CharField(max_length=50)
    created_on = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.dept_name



class User(AbstractBaseUser):

    # add additional fields here
    user_id = models.CharField(max_length=15, unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    active = models.BooleanField(default=True)# can login
    staff = models.BooleanField(default=False)  # staff user non superuser
    admin = models.BooleanField(default=False)  # superuser

    USER_TYPE_CHOICES = (
        (1, 'student'),
        (2, 'lecturer'),
        (3, 'bursary'),
        (4, 'system'),
        (5, 'admin'),
    )

    user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
    USERNAME_FIELD = 'user_id'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'user_type']

    objects = UserManager()

    def __str__(self):
        return self.user_id

    def get_full_name(self):
        return self.first_name + " " + self.last_name

    def get_user_type(self):
            return self.user_type

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True


    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin
    @property
    def is_active(self):
        return self.active


class StudentProfile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    semester = models.ForeignKey(SemesterData, on_delete=models.SET_NULL, null=True)
    dept_name = models.ForeignKey(DepartmentData, on_delete=models.SET_NULL, null=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)

    def __str__(self):
        return self.user.first_name

class SemesterData(models.Model):
    sid = models.ForeignKey(SessionData, on_delete=models.CASCADE)
    semester_name = models.CharField(max_length=50)

    def __str__(self):
            return self.semester_name

    def current(self):

        if SettingsData.objects.all().count():
            st = SettingsData.objects.get(id=1)
            if self.id == st.current_id:
                return "Current Session-Semester"
            else:
                return format_html('<a href="{}"  class="btn btn-primary btn-sm">{}</a>', reverse('system:current_session_semester', args=[self.id]),
                                   'Set Current')
        else:
                return format_html('<a href="{}" class="btn btn-primary">{}</a>', reverse('system:current_session_semester', args=[self.id]),
                                   'Set Current')

вот мой table.py

class StudentTable(tables.Table):

    user_id = tables.Column(attrs = {'th': {'class': 'danger'}})
    first_name = tables.Column(attrs = {'th': {'class': 'danger'}})
    last_name = tables.Column(attrs = {'th': {'class': 'danger'}})

    avatar = tables.Column(accessor ="user", verbose_name = "ass" )



    active = tables.Column(attrs = {'th': {'class': 'danger'}})

    last_login = tables.Column(attrs = {'th': {'class': 'danger'}})
    edit_Action = tables.LinkColumn('system:semester_edit', text='Edit', args=[A('pk')],attrs={'a':{'class':'btn btn-info btn-sm'}, 'td':{'align': 'center'}, 'th': {'class': 'danger'}}, orderable=False)

    class Meta:
        model = StudentProfile
        attrs = {'class':'table table-hover table-bordered table-responsive'}
        sequence = ('user_id', 'first_name', 'last_name', 'avatar')
        exclude = {'id', 'user', 'password', 'staff', 'admin'}
        empty_text = _("There are no students yet")
        template_name = 'django_tables2/bootstrap4.html'

Я хотел бы получить имя отдела, semester_nameа также поля в studentProfile, который служит моделью моей таблицы

1 Ответ

0 голосов
/ 25 января 2019

Вы видите пустые значения для всех полей с вашей текущей конфигурацией, потому что вы пытаетесь получить доступ к полям user_id, first_name и last_name, которые не являются полями модели StudentProfile, а скорее полями User модель (с которой StudentProfile связана с полем user).

При этом вы должны получить доступ к этим полям через отношение user, что-то вроде этого:

class StudentTable(tables.Table):
    user_id = tables.Column(accessor='user.user_id', ...)
    first_name = tables.Column(accessor='user.first_name', ...)
    last_name = tables.Column(accessor='user.last_name', ...)
    ...

Что касается отношений DepartmentData и SemesterData, я не уверен, почему они не отображаются по умолчанию, поскольку они являются полями модели StudentProfile и не исключаются через exclude собственность на Meta. Вы можете попытаться явно перечислить их в свойстве fields и посмотреть, поможет ли это.

...