zoukankan      html  css  js  c++  java
  • Django补充

    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请求实现

  • 相关阅读:
    mock.js
    v-bind和v-model的区别
    if语句中的return
    js中全局变量和局部变量以及变量声明提升
    js中全局和局部变量的区别
    相对路径、绝对路径
    commonJs
    B/S与C/S
    background-origin
    DOM
  • 原文地址:https://www.cnblogs.com/jiaqi-666/p/9991898.html
Copyright © 2011-2022 走看看