1. 程式人生 > >用type動態創建Form

用type動態創建Form

pos 創建 tor asdfasdf bject div 標識 port exce

type時所有元類的父親
object是type(object的類型是type),type也是object(type繼承自object)
>>> isinstance(object, type) True >>> isinstance(type, object) True 在python中一切皆object,所有對象都是從object繼承而來的,type也是object,而object的type是type >>> type.__base__ <type object> >>> type(object
) <type type> 1、type是一切type的類型 2、object是所有對象的基類,type也繼承自object 3、object的type是type 去掉object所有對象都不能用了,而去掉type,所有對象還是可以正常運作的,只是沒有一個東西標識他的類型了
def score(request, class_id, qn_id):
    """
    :param request:
    :param class_id: 班級ID
    :param qn_id: 問卷ID
    :return:
    """
    student_id = request.session[
student_info][id] # 1. 當前登錄用戶是否是要評論的班級的學生 ct1 = models.Student.objects.filter(id=student_id, cls_id=class_id).count() if not ct1: return HttpResponse(你只能評論自己班級的問卷,是不是想轉班?) # 2. 你是否已經提交過當前問卷答案 ct2 = models.Answer.objects.filter(stu_id=student_id, question__naire_id=qn_id).count()
if ct2: return HttpResponse(你已經參與過調查,無法再次進行) # 3. 展示當前問卷下的所有問題 # question_list = models.Question.objects.filter(naire_id=qn_id) from django.forms import Form from django.forms import fields from django.forms import widgets # # 類:方式一 # class TestForm(Form): # tp1 = fields.ChoiceField(label=路寧傻不傻?,choices=[ (i,i) for i in range(1,11)],widget=widgets.RadioSelect) # tp2 = fields.ChoiceField(label=路寧傻不傻?,choices=[ (i,i) for i in range(1,11)],widget=widgets.RadioSelect) # tp3 = fields.CharField(label=對路寧的建議?,widget=widgets.Textarea) # tp4 = fields.ChoiceField(label=路寧帽子顏色?,choices=[ (i,i) for i in range(1,11)],widget=widgets.RadioSelect) # # # 類:方式二 # MyTestForm = type("MyTestForm",(Form,),{ # tp1: fields.ChoiceField(label=路寧傻不傻?,choices=[ (i,i) for i in range(1,11)],widget=widgets.RadioSelect), # tp2: fields.ChoiceField(label=路寧傻不傻?,choices=[ (i,i) for i in range(1,11)],widget=widgets.RadioSelect), # tp3: fields.CharField(label=對路寧的建議?,widget=widgets.Textarea), # tp4: fields.ChoiceField(label=路寧帽子顏色?,choices=[ (i,i) for i in range(1,11)],widget=widgets.RadioSelect), # }) # return render(request,score.html,{question_list:question_list,form:MyTestForm()}) question_list = models.Question.objects.filter(naire_id=qn_id) field_dict = {} for que in question_list: if que.tp == 1: field_dict[val_%s % que.id] = fields.ChoiceField( label=que.caption, error_messages={required:必填}, widget=widgets.RadioSelect, choices=[(i, i) for i in range(1, 11)] ) elif que.tp == 2: field_dict[option_id_%s % que.id] = fields.ChoiceField( label=que.caption, widget=widgets.RadioSelect, choices=models.Option.objects.filter( qs_id=que.id).values_list(id, name)) else: from django.core.exceptions import ValidationError from django.core.validators import RegexValidator # field_dict[x_%s % que.id] = fields.CharField( # label=que.caption, widget=widgets.Textarea,validators=[RegexValidator(regex=""),]) field_dict[content_%s % que.id] = fields.CharField( label=que.caption, widget=widgets.Textarea, validators=[func, ]) # 類:方式二 MyTestForm = type("MyTestForm", (Form,), field_dict) if request.method == GET: form = MyTestForm() return render(request, score.html, {question_list: question_list, form: form}) else: # 15字驗證 # 不允許為空 form = MyTestForm(request.POST) if form.is_valid(): print(form.cleaned_data) # {x_2: 3, x_9: sdfasdfasdfasdfasdfasdfasdf, x_10: 13} objs = [] for key,v in form.cleaned_data.items(): k,qid = key.rsplit(_,1) answer_dict = {stu_id:student_id,question_id:qid,k:v} objs.append(models.Answer(**answer_dict)) models.Answer.objects.bulk_create(objs) return HttpResponse(感謝您的參與!!!) return render(request, score.html, {question_list: question_list, form: form})

用type動態創建Form