【问题标题】:Display misconception in django-tables2在 django-tables2 中显示误解
【发布时间】:2019-01-25 12:27:08
【问题描述】:

在我的应用程序中创建自定义用户模型后,我有一个继承自用户模型的 studentProfile,其中还包含头像、学期和部门名称。效果很好。但是,当我尝试使用 django-tables2 显示此 studentProfile 数据时,所有行都一直显示“-”,并且捕获的 ID 来自用户模型而不是 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'

我很想获得部门名称、学期名称以及作为我的表模型的 studentProfile 中的字段

【问题讨论】:

  • 我们可以看看你的模型定义吗?
  • 我已经更新了我的问题

标签: django django-models accessor django-tables2


【解决方案1】:

您在当前配置中看到所有字段的空值,因为您尝试访问字段 user_idfirst_namelast_name,它们不是 StudentProfile 模型的字段,而是User 模型(StudentProfileuser 字段相关)。

话虽如此,您应该通过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', ...)
    ...

DepartmentDataSemesterData 关系而言,我不确定为什么默认情况下不显示它们,因为它们是StudentProfile 模型的字段,并且它们不会通过Meta 上的 exclude 属性。您也许可以尝试在 fields 属性中明确列出它们,看看是否有帮助。

【讨论】:

  • 这样,所有带有访问器的值都不会显示,而且头像是 studentProfile 中的一个字段,它也显示“-”
  • 此外,我能够使用我之前拥有的用户模型获取值,问题是,我的表没有看到 studentProfile 字段值以及相关模型
  • 我使用您的代码设置了一个测试项目,并添加了我在此答案中列出的更改,一切都按预期工作,请参见此处的屏幕截图:dropbox.com/s/pqyehgj1j2okfap/table.png?dl=0
  • 另外,你使用的是什么版本的django-tables2
  • 我正在使用 django 2.1.4 和 django-tables2 2.0.4
猜你喜欢
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
相关资源
最近更新 更多