问题描述
在我的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 (将#修改为@)