Django補充

modelformset_factory批量渲染表單

引入html

from django.forms.models import modelformset_factory

視圖函數django

    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})

模板app

{{ 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過濾時,其括號內必須是表內的字段,不能使用參數oop

xxx = "record"
Record.objects.filter(xxx=record_id)

這樣 ↑ 就會報錯,因此解決的方式是使用字典打散,以及Q函數,字典打散簡潔可是侷限在只能是且的關係,或的關係就只能用Q函數post

代碼以下:spa

xxx = "record"
dict = {}
dict["xxx"] = "record"
Record.objects.filter(**dict)

 Q函數

以搜索爲例code

# 搜索
        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請求實現orm

相關文章
相關標籤/搜索