modelformset_factory批量渲染表单
引入
from django.forms.models import modelformset_factory
视图函数
def get(self, request, class_study_record_id): model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModelForm, extra=0) # extra用户扩展添加为0则不显示添加 queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id) formset = model_formset_cls(queryset=queryset) return render(request, "study/StudentScore.html", {"formset": formset})
模板
{{ formset.management_form }} # 使用前必须先添加这句代码 {% for form in formset %} <tr> <td>{{ forloop.counter }}</td> <td>{{ form.instance.student }}</td> #加instance是用来只显示内容而不显示表单控件 <td>{{ form.instance.get_record }}</td> <td>{{ form.score }} </td> <td>{{ form.homework_note }}</td> </tr> {% endfor %}
model中的自定义get方法
def get_record(self): status_color = { "checked": "#66CD00", "vacate": "#B03060", "absence": "#FF3030", "late": "#FF4040", "leave_early": "#FF69B4" } return mark_safe("<span style='background-color:%s;color:white'>%s</span>" % (status_color[self.record], self.get_record_display()))
其中record为表中字段,目的可以实现在模板渲染中给record字段添加额外的样式
字典打散
Record.objects.filter(record=record_id)
如上在视图函数中进行filter过滤时,其括号内必须是表内的字段,不能使用参数
xxx = "record" Record.objects.filter(xxx=record_id)
这样 ↑ 就会报错,所以解决的方式是使用字典打散,以及Q函数,字典打散简洁但是局限在只能是且的关系,或的关系就只能用Q函数
代码如下:
xxx = "record" dict = {} dict["xxx"] = "record" Record.objects.filter(**dict)
Q函数
以搜索为例
# 搜索 val = request.GET.get('q') # 获取搜索条件 field = request.GET.get('field') # 获取搜索范围 if val: q = Q() q.children.append((field + "__contains", val)) # 注意必须是元组 元组内的两个分别为: 表内字段 and 筛选条件 customer_list = customer_list.filter(q)
合并条件进行查询:
con = Q() q1 = Q() q1.connector = 'OR' q1.children.append(('id', 1)) q1.children.append(('id', 2)) q1.children.append(('id', 3)) q2 = Q() q2.connector = 'OR' q2.children.append(('status', '在线')) con.add(q1, 'AND') con.add(q2, 'AND') models.Tb1.objects.filter(con)
视图函数相关
post请求结束使用redirect重定向会当前页面时,同样可以返回self.get(),通过get请求实现