微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

django-tables2在CBV中尝试显示相关记录的表

如何解决django-tables2在CBV中尝试显示相关记录的表

在我的Django应用程序中,我具有以下定义的公司模型和学生模型:

我的学生模型对公司模型有外键。

我用下面的SingleTableMixin创建了一个Detail View类。这个DetailedView将使用特定的公司,并且我能够显示特定记录的数据。每个公司都会有与之相关的学生,我希望在“公司详细信息”页面上的表格显示所有学生。我可以使用jquery数据表很容易地做到这一点,但是当有很多学生时,数据表解决方案就会崩溃。我对应用程序其他区域的django-tables2感到满意,并希望在我的详细信息页面显示该表。我绝不是新手开发人员,因此我的代码可能很简单。问题在于,在我的CBV中,我不知道如何从companyView将查询集传递给表类。

我的公司和学生模型是:

class Company(models.Model):
    company_id_num = models.CharField("Company ID Number",max_length=15,default=increment_company_id,editable=False)
    company_name = models.CharField("Name",max_length=255)
    company_url = models.URLField("URL",blank=True,null=True,max_length=200,)

    created_on = models.DateTimeField("created on",db_index=True,auto_Now_add=True)
    created_by = models.ForeignKey('auth.User',editable=False,default=None,related_name='company_created_by',on_delete=models.DO_nothing,)

    updated_on = models.DateTimeField("updated on",auto_Now=True)
    updated_by = models.ForeignKey('auth.User',related_name='company_updated_by',)

    class Meta:
        ordering = ["company_name"]
        verbose_name_plural = "companies"

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

    def save(self,**kwargs):
        user = get_current_user()
        self.company_name = self.company_name.title()
        if user and not user.pk:
            user = None
        if not self.pk:
            self.created_by = user
        self.updated_by = user
        super(Company,self).save()



class Student(models.Model):
    banned = models.BooleanField(default=False)
    first_name = models.CharField("First Name",max_length=50,db_index=True)
    middle_name = models.CharField("Middle Name",blank=True)
    last_name = models.CharField("Last Name",db_index=True)
    full_name = models.CharField("Full Name",max_length=255,blank=True)
    date_of_birth = models.DateField("Date of Birth",blank=True)
    email = models.EmailField("Email",blank=True)
    phone = PhoneNumberField(null=True,blank=True)
    mobile = PhoneNumberField(null=True,blank=True)
    address_street1 = models.CharField(max_length=500,blank=True)
    address_street2 = models.CharField(max_length=500,blank=True)
    address_city = models.CharField(max_length=500,blank=True)
    address_state = models.CharField(max_length=500,blank=True)
    address_zip = models.CharField(max_length=500,blank=True)
    address_country = models.CharField(max_length=500,blank=True)
    employee_id = models.CharField("Employee ID",blank=True)
    union_id = models.CharField("Union ID",blank=True)
    student_id = models.CharField("MSMS Student ID",default=increment_student_id,editable=False)
    student_notes = models.TextField('Notes',blank=True)

    company = models.ForeignKey('companies.Company',related_name='students',)
    department = models.ForeignKey('companies.Department',)
    union_master = models.ForeignKey('UnionMaster',)
    union_local = models.ForeignKey('UnionLocal',auto_Now_add=True,null=True)
    created_by = models.ForeignKey('auth.User',related_name='student_created_by',related_name='student_updated_by',)

    def __str__(self):
        return "{} {}".format(self.first_name,self.last_name)

    def save(self,**kwargs):
        user = get_current_user()
        if user and not user.pk:
            user = None
        if not self.pk:
            self.created_by = user
        self.updated_by = user
        self.last_name = self.last_name.upper()
        if self.middle_name:
            self.full_name = self.first_name + " " + self.middle_name + " " + self.last_name
        else:
            self.full_name = self.first_name + " " + self.last_name
        super(Student,self).save(**kwargs)

我的CompanyDetails视图如下:

class CompanyDetails(SingleTableMixin,DetailView):
    model = Company

    filterset_class = StudentFilter

    table_class = StudentTable

    template_name = "companies/company_details.html"
    table_pagination = {"per_page": 10}

    def get_context_data(self,**kwargs):
        context = super(CompanyDetails,self).get_context_data(**kwargs)
        return context

我的StudentTable看起来像这样:

class StudentTable(tables.Table):
    student_id = tables.LinkColumn('StudentDetails',args=[A('pk')])
    full_name = tables.LinkColumn('StudentDetails',args=[A('pk')])
    id = tables.LinkColumn('StudentDetails',args=[A('pk')])
    mobile = tables.Column()

    class Meta:
        model = Student
        template_name = 'django_tables2/bootstrap4.html'
        attrs = {"class": "table table-striped Nowrap table-bordered table-hover"}
        exclude = ('first_name','middle_name','last_name')
        fields = ('id','student_id','full_name','email','mobile',)
        sequence = ('id',)

    def render_mobile(self,value):
        return nice_phone_number(value)

我的StudentFilter看起来像这样:


class StudentFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='student_custom_filter',label='Table Search')

    class Meta:
        model = Student
        fields = ['q']

    def student_custom_filter(self,queryset,name,value):
        multi_field_filter = ''
        object_list = queryset.order_by('last_name')
        query = value
        fields = ['first_name','last_name','id','student_id']
        if query:
            multi_field_filter = get_query(query,fields)
        if multi_field_filter:
            object_list = queryset.filter(multi_field_filter).order_by('last_name')
        return object_list

当我使用jQuery Datatables时,这是我在模板中调用代码

      <div class="row may-form-body">
    <div class="col-md-12 table-responsive">
      {% for student in object.students.all %}
      <table class="table table-striped table-bordered Nowrap" id=
      "companyDetailTable" style="width:100%; margin:0 auto">
        <thead>
          <tr>
            <th>System ID</th>
            <th>Student ID</th>
            <th>Full Name</th>
            <th>Email</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>
              {% if student.id %} <a href=
              "{% url 'StudentDetails' student.id %}">{{
              student.id }}</a> {% endif %}
            </td>
            <td>
              {% if student.student_id %} <a href=
              "{% url 'StudentDetails' student.id %}">{{
              student.student_id }}</a> {% endif %}
            </td>
            <td>
              {% if student.full_name %} <a href=
              "{% url 'StudentDetails' student.id %}">{{
              student.full_name }}</a> {% endif %}
            </td>
            <td>{{ student.email }}</td>
          </tr>
        </tbody>
        <tfoot style="color: #b1b1cd">
          <tr>
            <th colspan="5">End of Data</th>
          </tr>
        </tfoot>
      </table>
    {% endfor %}
    </div>
  </div>

当我在模板中替换上面的数据表代码时,我在模板中使用以下代码

<div class="row" style="padding-top: 20px;">
   <div class="col-md-12">
      {% render_table table %}
   </div>
</div>

这会呈现我的StudentTable,但会使用我公司的查询集填充它。

当我更希望Company.objects.all()通过此queryset = Students.objects.all()。filter(company_id = pk)时有效。

我不知道如何在CompanyDetails CBV中提取pk,其次我不知道如何将查询集传递给同一视图中的table_class

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。