GVKun编程网logo

Django 用 ModelForm 批量保存 form 表单(非常实用的方法) mfor_verity 项目(django form表单提交)

7

本文的目的是介绍Django用ModelForm批量保存form表单的详细情况,特别关注非常实用的方法mfor_verity项目的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个

本文的目的是介绍Django 用 ModelForm 批量保存 form 表单的详细情况,特别关注非常实用的方法 mfor_verity 项目的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Django 用 ModelForm 批量保存 form 表单的机会,同时也不会遗漏关于10.Django ModelForm、Django - Form和ModelForm、Django 11 form 表单(状态保持 session、form 表单及注册实现)、Django Form and ModelForm的知识。

本文目录一览:

Django 用 ModelForm 批量保存 form 表单(非常实用的方法) mfor_verity 项目(django form表单提交)

Django 用 ModelForm 批量保存 form 表单(非常实用的方法) mfor_verity 项目(django form表单提交)

1. 先看一下 Model 非常多

from django.db import models
from users.models import UserProfile


# Create your models here.
class Edc_Project(models.Model):
    project_name = models.CharField(max_length=200, verbose_name="项目名称", default="")
    project_number = models.CharField(max_length=200,verbose_name="项目编号", default="")
    project_user = models.ForeignKey(UserProfile,verbose_name=''项目负责人'')
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "EDC项目信息"
        verbose_name_plural = verbose_name


class Edc_Center(models.Model):
    center_name = models.CharField(max_length=200, verbose_name="中心名称", default="")
    center_number = models.CharField(max_length=200,verbose_name="中心编号", default="")
    center_user = models.ManyToManyField(UserProfile, verbose_name=''中心负责人'')
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "EDC中心信息"
        verbose_name_plural = verbose_name


class Edc_Patient(models.Model):
    patient_number = models.CharField(max_length=200,verbose_name="患者编号", default="")
    patient_user = models.ForeignKey(UserProfile, verbose_name=''患者负责人'',null=True,blank=True)
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "EDC患者信息"
        verbose_name_plural = verbose_name


class Edc_Visit(models.Model):
    visit_name = models.CharField(max_length=200, verbose_name="访视名称", default="")
    visit_number = models.CharField(max_length=200,verbose_name="访视编号", default="")
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "EDC访视信息"
        verbose_name_plural = verbose_name


class Edc_Form(models.Model):
    form_name = models.CharField(max_length=200, verbose_name="表单名称", default="")
    form_number = models.CharField(max_length=200,verbose_name="表单缩写", default="")
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "EDC表单信息"
        verbose_name_plural = verbose_name




class Dr(models.Model):
    """
    发药纪录
    """
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    dr_center = models.ForeignKey(Edc_Center, verbose_name=''发药纪录_中心'')
    dr_patient = models.ForeignKey(Edc_Patient,verbose_name=''发药纪录_病人'')
    dr_visit = models.ForeignKey(Edc_Visit, verbose_name=''发药纪录_访视'')
    date_delivery = models.DateTimeField(verbose_name=''发药日期'',blank=True, null=True)
    drugs_name = models.CharField(verbose_name=''药品名称'',max_length=50, blank=True, null=True)
    dose = models.CharField(verbose_name=''剂量'',max_length=50, blank=True, null=True)
    dosage_form = models.CharField(verbose_name=''剂型'', max_length=50, blank=True, null=True)
    sign_drug_name = models.CharField(verbose_name=''领药人签字'', max_length=50, blank=True, null=True)
    drug_user_name = models.CharField(verbose_name=''发药人签字'', max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "发药纪录"
        verbose_name_plural = verbose_name



# class DrSelect(models.Model):
#     """
#     发药纪录的药品名称和剂量等
#     """
#     id = models.IntegerField(db_column=''ID'', blank=True, null=True)
#     druge = models.CharField(db_column=''DRUGE'', max_length=1000, blank=True, null=True)
#     dose = models.CharField(db_column=''DOSE'', max_length=1000, blank=True, null=True)
#     form = models.CharField(db_column=''FORM'', max_length=1000, blank=True, null=True)
#
#     class Meta:
#         managed = False
#         db_table = ''DR_SELECT''


class Eg(models.Model):
    """
    本次实验室检测结果
    """
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    eg_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    eg_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    eg_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    date_collection = models.DateTimeField(verbose_name=''采血日期'',blank=True, null=True)
    eg_cd4 = models.CharField(verbose_name=''CD4'',max_length=50, blank=True, null=True)
    eg_cd8 = models.CharField(verbose_name=''CD8'',max_length=50, blank=True, null=True)
    hiv_viral_load = models.CharField(verbose_name=''HIV病毒载量'',max_length=50, blank=True, null=True)
    leucocyte_count = models.CharField(verbose_name=''白细胞计数'',max_length=50, blank=True, null=True)
    total_lymphocyte = models.CharField(verbose_name=''总淋巴细胞计数'',max_length=50, blank=True, null=True)
    platelet_count = models.CharField(verbose_name=''血小板计数'',max_length=50, blank=True, null=True)
    eg_hemoglobin = models.CharField(verbose_name=''血红蛋白'',max_length=50, blank=True, null=True)
    serum_creatinine = models.CharField(verbose_name=''血肌酐'',max_length=50, blank=True, null=True)
    urea_nitrogen = models.CharField(verbose_name=''血尿素氮'',max_length=50, blank=True, null=True)
    eg_triglyceride = models.CharField(verbose_name=''甘油三酯'',max_length=50, blank=True, null=True)
    total_cholesterol = models.CharField(verbose_name=''总胆固醇'',max_length=50, blank=True, null=True)
    blood_sugar = models.CharField(verbose_name=''血糖'',max_length=50, blank=True, null=True)
    blood_amylase = models.CharField(verbose_name=''血淀粉酶'',max_length=50, blank=True, null=True)
    alanine_alt = models.CharField(verbose_name=''谷丙转氨酶ALT'',max_length=50, blank=True, null=True)
    aspertate_alt = models.CharField(verbose_name=''谷草转氨酶AST'',max_length=50, blank=True, null=True)
    bilirubin_bil = models.CharField(verbose_name=''总胆红素T.BIL'',max_length=50, blank=True, null=True)
    eg_hbsag = models.CharField(verbose_name=''HBsAg'',max_length=50, blank=True, null=True)
    eg_antihcv = models.CharField(verbose_name=''anti-HCV'',max_length=50, blank=True, null=True)
    drug_resistance = models.CharField(verbose_name=''耐药性检测'',max_length=50, blank=True, null=True)
    resistance_name = models.CharField(verbose_name=''耐药药物名称'',max_length=50, blank=True, null=True)

    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "本次实验室检测结果"
        verbose_name_plural = verbose_name


class Ggn(models.Model):
    ''''''
    肝功能
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    ggn_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    ggn_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    ggn_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采集日期'',blank=True, null=True)
    alanine_alt = models.CharField(verbose_name=''谷丙转氨酶ALT'',max_length=50, blank=True, null=True)
    aspertate_alt = models.CharField(verbose_name=''谷草转氨酶AST'',max_length=50, blank=True, null=True)
    bilirubin_bil = models.CharField(verbose_name=''总胆红素T.BIL'',max_length=50, blank=True, null=True)
    direct_bilirubin = models.CharField(verbose_name=''直接胆红素(DBIL)'',max_length=50, blank=True, null=True)
    total_protein = models.CharField(verbose_name=''血清总蛋白(TP)'',max_length=50, blank=True, null=True)
    serum_albumin = models.CharField(verbose_name=''血清白蛋白(ALB)'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "肝功能"
        verbose_name_plural = verbose_name


class Ncg(models.Model):
    ''''''
    尿常规
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    ncg_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    ncg_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    ncg_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采集日期'',blank=True, null=True)
    acidity_alkalinity = models.CharField(verbose_name=''酸碱度(pH)'',max_length=50, blank=True, null=True)
    specific_gravity = models.CharField(verbose_name=''尿比重(SG)'',max_length=50, blank=True, null=True)
    bile_proto = models.CharField(verbose_name=''尿胆原(URO)'',max_length=50, blank=True, null=True)
    occult_blood = models.CharField(verbose_name=''隐血(BLO)'',max_length=50, blank=True, null=True)
    ncg_leukocyte = models.CharField(verbose_name=''白细胞(WBC)'',max_length=50, blank=True, null=True)
    ucg_protein = models.CharField(verbose_name=''尿蛋白(PRO)'',max_length=50, blank=True, null=True)
    ncg_niaotang = models.CharField(verbose_name=''尿糖(GLU)'',max_length=50, blank=True, null=True)
    ncg_bilirubin = models.CharField(verbose_name=''胆红素(BIL)'',max_length=50, blank=True, null=True)
    ncg_ketone = models.CharField(verbose_name=''酮体(KET)'',max_length=50, blank=True, null=True)
    red_blood = models.CharField(verbose_name=''尿红细胞(RBC)'',max_length=50, blank=True, null=True)
    urine_colour = models.CharField(verbose_name=''尿液颜色(GOL)'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "尿常规"
        verbose_name_plural = verbose_name


class Sxqgn(models.Model):
    ''''''
    肾小球功能
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    sxqgn_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    sxqgn_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    sxqgn_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采血日期'',blank=True, null=True)
    serum_creatinine = models.CharField(verbose_name=''血肌酐'',max_length=50, blank=True, null=True)
    urea_nitrogen = models.CharField(verbose_name=''血尿素氮'',max_length=50, blank=True, null=True)
    uric_acid = models.CharField(verbose_name=''血尿酸(UA)'',max_length=50, blank=True, null=True)
    serum_cystatin = models.CharField(verbose_name=''血清胱抑素C(CysC)'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "肾小球功能"
        verbose_name_plural = verbose_name


class Tr(models.Model):
    ''''''
    本次抗毒治疗治疗处方
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    tr_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    tr_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    tr_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    drugs_name = models.CharField(verbose_name=''药品名称'',max_length=50, blank=True, null=True)
    unit_dose = models.CharField(verbose_name=''单位剂量'',max_length=50, blank=True, null=True)
    single_dosage = models.CharField(verbose_name=''单次用药量'',max_length=50, blank=True, null=True)
    method_taking = models.CharField(verbose_name=''服用方法'',max_length=50, blank=True, null=True)
    dose_hair = models.CharField(verbose_name=''发药量'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "本次抗毒治疗治疗处方"
        verbose_name_plural = verbose_name


class V1A(models.Model):
    ''''''
    V1A
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    v1a_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    v1a_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    v1a_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    agency_code = models.CharField(verbose_name=''治疗机构代码'',max_length=50, blank=True, null=True)
    treatment_number = models.CharField(verbose_name=''抗病毒治疗号'',max_length=50, blank=True, null=True)
    antiviral_therapy = models.CharField(verbose_name=''抗病毒治疗类型'',max_length=50, blank=True, null=True)
    treatment_code = models.CharField(verbose_name=''病人治疗编码'',max_length=50, blank=True, null=True)
    card_number = models.CharField(verbose_name=''传染病报告卡卡片编号'',max_length=50, blank=True, null=True)
    birth_date = models.CharField(verbose_name=''出生日期'',max_length=50, blank=True, null=True)
    v1a_sex = models.CharField(verbose_name=''性别'',max_length=50, blank=True, null=True)
    source_treatment = models.CharField(verbose_name=''抗病毒治疗费用来源'',max_length=50, blank=True, null=True)
    sources_cost = models.CharField(verbose_name=''其他费用来源'',max_length=50, blank=True, null=True)
    marital_status = models.CharField(verbose_name=''婚姻状况'',max_length=50, blank=True, null=True)
    hiv_time = models.CharField(verbose_name=''确诊HIV抗体阳性时间'',max_length=50, blank=True, null=True)
    infection_pathway = models.CharField(verbose_name=''感染途径'',max_length=50, blank=True, null=True)
    year_tuberculosis = models.CharField(verbose_name=''近一年是否患肺结核'',max_length=50, blank=True, null=True)
    patient_phthisis = models.CharField(verbose_name=''病人是否接受抗结核治疗'',max_length=50, blank=True, null=True)
    aids_symptom = models.CharField(verbose_name=''近三个月是否出现下列艾滋病相关病症'',max_length=50, blank=True, null=True)
    related_diseases = models.CharField(verbose_name=''相关疾病/症状'',max_length=50, blank=True, null=True)
    other_diseases = models.CharField(verbose_name=''其它机会性感染/肿瘤'',max_length=50, blank=True, null=True)
    below_diseases = models.CharField(verbose_name=''目前病人是否出现以下症状、体征'',max_length=50, blank=True, null=True)
    v1a_diseases = models.CharField(verbose_name=''症状、体征'',max_length=50, blank=True, null=True)
    clinical_stages = models.CharField(verbose_name=''目前临床病人WHO临床分期'',max_length=50, blank=True, null=True)
    v1a_weight = models.CharField(verbose_name=''病人目前体重'',max_length=50, blank=True, null=True)
    v1a_height = models.CharField(verbose_name=''身高'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "V1A"
        verbose_name_plural = verbose_name


class V1C(models.Model):
    ''''''
    V1C
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    v1c_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    v1c_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    v1c_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    scheme_antivira = models.CharField(verbose_name=''既往接受过几种方案的抗病毒治疗'',max_length=50, blank=True, null=True)
    antiviral_name = models.CharField(verbose_name=''曾使用的抗病毒药物名称'',max_length=50, blank=True, null=True)
    prevent_infect = models.CharField(verbose_name=''是否接受过复方新诺明预防机会性感染治疗'',max_length=50, blank=True, null=True)
    whether_take = models.CharField(verbose_name=''目前是否仍在服用'',max_length=50, blank=True, null=True)
    whether_adanon = models.CharField(verbose_name=''目前是否使用美沙酮'',max_length=50, blank=True, null=True)
    date_antitoxic = models.CharField(verbose_name=''抗毒治疗开始日期'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "V1C"
        verbose_name_plural = verbose_name


class V2A(models.Model):
    ''''''
    V2A
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    v2a_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    v2a_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    v2a_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    patient_died = models.CharField(verbose_name=''病人是否死亡或转出'',max_length=50, blank=True, null=True)
    cause_termination = models.CharField(verbose_name=''终止原因'',max_length=50, blank=True, null=True)
    date_death = models.CharField(verbose_name=''死亡日期'',max_length=50, blank=True, null=True)
    cause_death = models.CharField(verbose_name=''死亡原因'',max_length=50, blank=True, null=True)
    transfer_date = models.CharField(verbose_name=''转出日期'',max_length=50, blank=True, null=True)
    flup_content = models.CharField(verbose_name=''本次随访内容'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "V2A"
        verbose_name_plural = verbose_name


class V2B(models.Model):
    ''''''
    v2b
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    v2b_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    v2b_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    v2b_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    clinical_stages = models.CharField(verbose_name=''目前病人WHO临床分期'',max_length=50, blank=True, null=True)
    aids_disease = models.CharField(verbose_name=''自上次访视,是否出现过以下艾滋病相关病症'',max_length=50, blank=True, null=True)
    skin_damage = models.CharField(verbose_name=''皮肤损害'',max_length=50, blank=True, null=True)
    disposal_method = models.CharField(verbose_name=''处置方式'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "V2B"
        verbose_name_plural = verbose_name


class V2D(models.Model):
    ''''''
    V2D
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    v2d_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    v2d_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    v2d_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    infection_treatment = models.CharField(verbose_name=''是否接受过复方新诺明预防机会性感染治疗'',max_length=50, blank=True, null=True)
    if_adanon = models.CharField(verbose_name=''目前是否使用美沙酮'',max_length=50, blank=True, null=True)
    clinical_disposal = models.CharField(verbose_name=''临床处置'',max_length=50, blank=True, null=True)
    change_medicine = models.CharField(verbose_name=''换药原因'',max_length=50, blank=True, null=True)
    other_dressing = models.CharField(verbose_name=''其他换药原因'',max_length=50, blank=True, null=True)
    change_reaction = models.CharField(verbose_name=''换药具体副反应'',max_length=50, blank=True, null=True)
    cause_drug = models.CharField(verbose_name=''停药原因'',max_length=50, blank=True, null=True)
    other_drug = models.CharField(verbose_name=''其他停药原因'',max_length=50, blank=True, null=True)
    change_drug = models.CharField(verbose_name=''停药具体副反应'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)



    class Meta:
        verbose_name = "V2D"
        verbose_name_plural = verbose_name


class Xcg(models.Model):
    ''''''
    血常规
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    xcg_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    xcg_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    xcg_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采血日期'',blank=True, null=True)
    leucocyte_count = models.CharField(verbose_name=''白细胞计数'',max_length=50, blank=True, null=True)
    lymphocyte_count = models.CharField(verbose_name=''总淋巴细胞计数'',max_length=50, blank=True, null=True)
    platelet_count = models.CharField(verbose_name=''血小板计数'',max_length=50, blank=True, null=True)
    xcg_hemoglobin = models.CharField(verbose_name=''血红蛋白'',max_length=50, blank=True, null=True)
    neutrophil_count = models.CharField(verbose_name=''中性粒细胞计数'',max_length=50, blank=True, null=True)
    red_number = models.CharField(verbose_name=''红细胞总数'',max_length=50, blank=True, null=True)
    red_volume = models.CharField(verbose_name=''平均红细胞容积'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "血常规"
        verbose_name_plural = verbose_name


class Xdfm(models.Model):
    ''''''
    血淀粉酶
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    xdfm_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    xdfm_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    xdfm_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采血日期'',blank=True, null=True)
    blood_amylase = models.CharField(verbose_name=''血淀粉酶'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "血淀粉酶"
        verbose_name_plural = verbose_name


class Xt(models.Model):
    ''''''
    血糖
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'',max_length=50, blank=True, null=True)
    xt_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    xt_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    xt_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采血日期'',blank=True, null=True)
    blood_sugar = models.CharField(verbose_name=''血糖'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "血糖"
        verbose_name_plural = verbose_name


class Xzsx(models.Model):
    ''''''
    血脂四项
    ''''''
    formame = models.CharField(verbose_name=''Modelform名称'', max_length=50, blank=True, null=True)
    xzsx_center = models.ForeignKey(Edc_Center, verbose_name=''中心'')
    xzsx_patient = models.ForeignKey(Edc_Patient,verbose_name=''病人'')
    xzsx_visit = models.ForeignKey(Edc_Visit, verbose_name=''访视'')
    collection_date = models.DateTimeField(verbose_name=''采血日期'',blank=True, null=True)
    xzsx_triglyceride = models.CharField(verbose_name=''甘油三酯'',max_length=50, blank=True, null=True)
    total_cholesterol = models.CharField(verbose_name=''总胆固醇'',max_length=50, blank=True, null=True)
    low_lipoprotein = models.CharField(verbose_name=''低密度脂蛋白'',max_length=50, blank=True, null=True)
    high_lipoprotein = models.CharField(verbose_name=''高密度脂蛋白'',max_length=50, blank=True, null=True)
    add_time = models.DateTimeField(auto_now=True)


    class Meta:
        verbose_name = "血脂四项"
        verbose_name_plural = verbose_name
Model

 

2.ModelForm 的定义

from django import forms
from django.forms import ModelForm
from .models import Dr,Eg,Ggn,Ncg,Sxqgn,Tr,V1A,V1C,V2A,V2B,V2D,Xcg,Xdfm,Xt,Xzsx


class DrForm(ModelForm):
    class Meta:
        model = Dr
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class EgForm(ModelForm):
    class Meta:
        model = Eg
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class GgnForm(ModelForm):
    class Meta:
        model = Ggn
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class NcgForm(ModelForm):
    class Meta:
        model = Ncg
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class SxqgnForm(ModelForm):
    class Meta:
        model = Sxqgn
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class TrForm(ModelForm):
    class Meta:
        model = Tr
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class V1AForm(ModelForm):
    class Meta:
        model = V1A
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class V1CForm(ModelForm):
    class Meta:
        model = V1C
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class V2AForm(ModelForm):
    class Meta:
        model = V2A
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class V2BForm(ModelForm):
    class Meta:
        model = V2B
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class V2DForm(ModelForm):
    class Meta:
        model = V2D
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class V2DForm(ModelForm):
    class Meta:
        model = V2D
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class XcgForm(ModelForm):
    class Meta:
        model = Xcg
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class XdfmForm(ModelForm):
    class Meta:
        model = Xdfm
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class XtForm(ModelForm):
    class Meta:
        model = Xt
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }


class XzsxForm(ModelForm):
    class Meta:
        model = Xzsx
        localized_fields = (''__all__'')

        exclude = [''add_time'']

        widgets = {}
        error_messages = {
            ''protype'': {
                ''required'':''这是个必填项目'', #生成错误信息
            },
        }
ModelForm 的定义

 

3.View 逻辑的写法

from django.shortcuts import render
import os
import re
import json
from mfor_verity.settings import MEDIA_ROOT
from django.contrib.auth.decorators import login_required
# 指定返回给用户的类型
from django.http import HttpResponse
from django.shortcuts import render
from django.utils.decorators import method_decorator
from django.views.generic.base import View
from django.core import serializers
from .forms import DrForm,EgForm,GgnForm,NcgForm,SxqgnForm,TrForm,V1AForm,V1CForm,V2AForm,V2BForm,V2DForm,XcgForm,XdfmForm,XtForm,XzsxForm

from django.forms.formsets import formset_factory
from project_contrast.models import Edc_Project,Edc_Center,Edc_Patient,Edc_Visit,Edc_Form
from users.models import UserProfile
# Create your views here.



class ProjectFormSave(View):
    """
    保存表单信息
    """
    def post(self,request):


        #在model中统一定义一个字段为modelform的名称,
        # 通过前端的填写先任意匹配一个modelfrom得到这个字段的名称后,
        # 进行真正modelform的数据获取
        form = XtForm(request.POST)
        print(form.data)

        # eval() 字符串转变量 代表modelform 如:DrForm
        formset = eval(form.data.get(''formame''))
        form = formset(request.POST)


        if form.is_valid():
            #注释为保存外键的写法,前端没有输入外键内容的情况下,本次为前端通过
            #点击赋予值进行隐藏
            # instance = form.save(commit=False)
    
            # instance.xt_center_id = edc_center_id  
            # instance.xt_patient_id = edc_patient_id
            # instance.xt_visit_id = edc_visit_id
            # instance.save()
            form.save()
        else:
            error = form.errors  #错误信息
            # return render(request, ''forms.html'', {''form'': form, ''error'': error})
            print(error)
            return HttpResponse(''{"status":"fail"}'', content_type=''application/json'')

        return HttpResponse(''{"status":"success"}'', content_type=''application/json'')


    def get(self,request):
        """
        生成前端的表单文件添加一定的样式注意:html中一定要加name属性和model的name一致
        """

        model_form_name = request.GET.get(''model_form_name'','''')

        #字符串转变量
        formset = eval(model_form_name+''Form()'')
        print(formset)
        all_html = ''''

        for form in formset:
            all_html += ''<div>'' \
                        ''<label for="{}">{}'' \
                        ''</label><div>'' \
                        ''<input type="text" name="{}"id="{}">'' \
                          ''</div></div>''.format(form.id_for_label,form.label,form.html_name,form.id_for_label)

        all_datas = {
            ''all_html'':all_html
        }

        return HttpResponse(json.dumps(all_datas), content_type=''application/json'')

 

4.URL 的写法

# 返回对照页面
    url(r''^control_page/$'', Control_Page.as_view(), name=''control_page''),

    #保存提交的表单信息
    url(r''^projectformsave/$'', ProjectFormSave.as_view(), name=''projectformsave''),

 

5.Jquery 的 ajax 的写法

var model_form_name = '''';
//点击右侧表单信息获取相应model生成form表单
$(''#id_form_menu>a'').each(function(index){
   $(this).on(''click'',function(){

       //获取model的名称
       model_form_name = $(this).children(''span'').text();
       console.log(model_form_name);

       $.get(''/projectformsave/'',{''model_form_name'':model_form_name},function(data){
            console.log(data);
            console.log(data.all_html);
            $(''#project_form_edc'').empty();
            $(''#project_form_edc'').append(data.all_html);
       })
   })
});




//Ajax异步提交表单提交表单
$(''#id_edc_submit'').on(''click'',function(){

    var data = $("#project_form_edc").serialize();

    $.ajax({
        cache: false,
        type: "POST",
        url: "/projectformsave/",
        dataType:''json'',
        async: true,
        data:data,

        success: function(data) {


        },
        beforeSend: function(xhr, settings) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    });

});

 

6.HTML 的写法先通过点击来获取表单的 html 内容,生成表单然后 ajax 异步提交表单

<form id = "project_form_edc" action="/projectformsave/" class="form-horizontal" role="form">
{#                    <div class="form-group">#}
{#                        <label for="firstname" class="col-sm-4 control-label">名字</label>#}
{#                        <div class="col-sm-8">#}
{#                            <input type="text" class="form-control" id="firstname">#}
{#                        </div>#}
{#                    </div>#}
{#                    <div class="form-group">#}
{#                        <label for="lastname" class="col-sm-4 control-label">化疗周期</label>#}
{#                        <div class="col-sm-8">#}
{#                            <input type="text" class="form-control" id="lastname">#}
{#                        </div>#}
{#                    </div>#}
{#                    <div class="modal-footer">#}
{#                        <button type="submit" id = "jsLoginBtn" class="btn btn-primary">#}
{#                            提交更改#}
{#                        </button>#}
{#                    </div>#}

                </form>
                <div class="modal-footer">
                    <button type="button" id = "id_edc_submit" class="btn btn-primary">
                        提交表单
                    </button>
                </div>
            </section>

 

10.Django ModelForm

10.Django ModelForm

ModelForm

 1.ModeForm简单验证

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    # verbose_name 等同于Form类里面的label
    username = models.CharField(verbose_name=''用户'',max_length=32)
    email = models.EmailField(verbose_name=''邮件'')
    user_type = models.ForeignKey(verbose_name=''类型'',to=''UserType'',to_field=''id'')


class UserType(models.Model):
    caption = models.CharField(max_length=32)

    def __str__(self):          #打印名称,不写显示的是obj对象
        return self.caption

models.py
model.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/index/" method="post">
        {% csrf_token %}
        {{ obj.as_p }}
        <input type="submit" value="提交"/>
    </form>

</body>
</html>

index.html
index.html

views.py

from django.shortcuts import render,redirect
from app01 import models
from django import forms
from django.forms import fields

class UserInfoModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo  # 去UserInfo类中获取数据
        fields = ''__all__''  # __all__ 代指所有字段
        # fields = [''username'',''email'']       #指定显示的字段
        # exclude = [''username'']      #不显示的字段

def index(request):
    if request.method == ''GET'':
        obj = UserInfoModelForm()
        return render(request,''index.html'',{''obj'':obj})
    elif request.method == ''POST'':
        obj = UserInfoModelForm(request.POST)
        result = obj.is_valid()
        if result:
            print(obj.cleaned_data)             #如果models里没有__str__方法,则user_type获取
                                                        #到的是一个对象,可直接根据对象进行操作
            print(obj.cleaned_data[''user_type''])
            # {''username'': ''James'', ''user_type'': < UserType: 超级用户 >, ''email'': ''ffd@fdsf.com''}
            # 超级用户
        else:
            print(obj.errors)
        return render(request,''index.html'',{''obj'':obj})

注:ModelForm最终继承了BaseForm,BaseForm里面具有is_valid方法,所以ModelForm也可以用is_valid进行验证

 2.ModelForm组件

ModelForm
    a.  class Meta:
            model,                           # 对应Model的
            fields=None,                     # 字段
            exclude=None,                    # 排除字段 
            labels=None,                     # 提示信息  labels ={''username'':''用户名''}可写多个
            help_texts=None,                 # 帮助提示信息    help_texts = {''username'':''help info''}
            widgets=None,                    # 自定义插件
            error_messages=None,             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
            field_classes=None               # 自定义字段类 (也可以自定义字段)
            localized_fields=(''birth_date'',) # 本地化,如:根据不同时区显示数据
            如:
                数据库中
                    2016-12-27 04:10:57
                setting中的配置
                    TIME_ZONE = ''Asia/Shanghai''
                    USE_TZ = True
                则显示:
                    2016-12-27 12:10:57
    b. 验证执行过程
        is_valid -> full_clean -> 钩子 -> 整体错误
 
    c. 字典字段验证
        def clean_字段名(self):
            # 可以抛出异常
            # from django.core.exceptions import ValidationError
            return "新值"
    d. 用于验证
        model_form_obj = XXOOModelForm()
        model_form_obj.is_valid()
        model_form_obj.errors.as_json()
        model_form_obj.clean()
        model_form_obj.cleaned_data
    e. 用于创建
        model_form_obj = XXOOModelForm(request.POST)
        #### 页面显示,并提交 #####
        # 默认保存多对多
            obj = form.save(commit=True)
        # 不做任何操作,内部定义 save_m2m(用于保存多对多)
            obj = form.save(commit=False)
            obj.save()      # 保存单表信息
            obj.save_m2m()  # 保存关联多对多信息
 
    f. 用于更新和初始化
        obj = model.tb.objects.get(id=1)
        model_form_obj = XXOOModelForm(request.POST,instance=obj)
        ...
 
        PS: 单纯初始化
            model_form_obj = XXOOModelForm(initial={...})

ModelForm所有组件
所有组件

(1)自定义插件widgets

from django.forms import widgets as Fwidgets    #避免跟widgets重名
class UserInfoModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo     #去UserInfo类中获取数据
        fields = ''__all__''        #__all__ 代指所有字段
        labels ={''username'':''用户名''}
        help_texts = {''username'':''...''}
        widgets = {
            ''username'':Fwidgets.Textarea(attrs={''class'':''c1''})
        }

(2)错误信息error_message

from django.forms import widgets as Fwidgets    #避免跟widgets重名
class UserInfoModelForm(forms.ModelForm):
    class Meta:
        ---snip---
        error_messages = {
            ''__all__'':{},       #整体的错误信息
            ''email'':{''required'':''邮箱不能为空''}
        }

(3)自定义更改字段验证规则field_classses

from django.forms import fields as Ffields     #避免跟fields重名
class UserInfoModelForm(forms.ModelForm):
    class Meta:
        ---snip---
        field_classes ={
            ''email'':Ffields.URLField    #把邮件格式改为url格式验证
        }
from django.shortcuts import render,redirect
from app01 import models
from django import forms
from django.forms import fields
from django.forms import widgets as Fwidgets
from django.forms import fields as Ffields     


class UserInfoModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo  # 去UserInfo类中获取数据
        fields = ''__all__''  # __all__ 代指所有字段
        labels = {''username'': ''用户名''}
        help_texts = {''username'': ''...''}
        widgets = {
            ''username'': Fwidgets.Textarea(attrs={''class'': ''c1''})
        }
        error_messages = {
            ''__all__'': {},  # 整体的错误信息
            ''email'': {''required'': ''邮箱不能为空''}
        }
        field_classes = {
            ''email'': Ffields.URLField  # 把邮件格式改为url格式验证
        }

def index(request):
    if request.method == ''GET'':
        obj = UserInfoModelForm()
        return render(request,''index.html'',{''obj'':obj})
    elif request.method == ''POST'':
        obj = UserInfoModelForm(request.POST)
        result = obj.is_valid()
        if result:
            print(obj.cleaned_data)             #如果models里没有__str__方法,则user_type获取
                                                        #到的是一个对象,可直接根据对象进行操作
            print(obj.cleaned_data[''user_type''])
            # {''username'': ''James'', ''user_type'': < UserType: 超级用户 >, ''email'': ''ffd@fdsf.com''}
            # 超级用户
        else:
            print(obj.errors)
        return render(request,''index.html'',{''obj'':obj})
全部代码

3.ModelForm创建保存数据

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    # verbose_name 等同于Form类里面的label
    username = models.CharField(verbose_name=''用户'',max_length=32)
    email = models.EmailField(verbose_name=''邮件'')
    user_type = models.ForeignKey(verbose_name=''类型'',to=''UserType'',to_field=''id'')
    user_group = models.ManyToManyField(''UserGroup'')

class UserType(models.Model):
    caption = models.CharField(max_length=32)

    def __str__(self):          #打印名称,不写显示的是obj对象
        return self.caption

class UserGroup(models.Model):
    groupname = models.CharField(max_length=32)

    def __str__(self):          #打印名称,不写显示的是obj对象
        return self.groupname
models
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/index/" method="post">
        {% csrf_token %}
        {{ obj.as_p }}
        <input type="submit" value="提交"/>
    </form>

</body>
</html>
index.html
from django import forms
from app import models
from django.forms import widgets as Fwidgets    #避免跟widgets重名
from django.forms import fields as Ffields     #避免跟fields重名
class UserInfoModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo     #去UserInfo类中获取数据
        fields = ''__all__''        #__all__ 代指所有字段
        labels ={''username'':''用户名''}
        help_texts = {''username'':''...''}
        widgets = {
            ''username'':Fwidgets.Textarea(attrs={''class'':''c1''})
        }
        error_messages = {
            ''__all__'':{},       #整体的错误信息
            ''email'':{''required'':''邮箱不能为空''}
        }

ModelForm验证
ModelForm验证

处理文件

from django.shortcuts import render
def index(request):
    if request.method == ''GET'':
        obj = UserInfoModelForm()
        return render(request,''index.html'',{''obj'':obj})
    elif request.method == ''POST'':
        obj = UserInfoModelForm(request.POST)
        if obj.is_valid():
            # 验证成功直接保存
            obj.save()         #默认commit=True,会保存多对多
            # 保存一对多表单
            # instance = obj.save(commit=False)
            # instance.save()
            # 保存多对多数据
            # obj.save_m2m()
        return render(request,''index.html'',{''obj'':obj})

4.ModelForm更新和初始化

描述:打开用户列表,显示用户信息,点击编辑跳转到编辑页面,Input显示选择用户的当前值;提交后,对数据进行更新

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r''^admin/'', admin.site.urls),
    url(r''^index/$'', views.index),
    url(r''^list/$'', views.user_list),
    url(r''^edit-(\d+)'', views.user_edit),
]
url.py
from django.db import models


class UserInfo(models.Model):
    # verbose_name 等同于Form类里面的label
    username = models.CharField(verbose_name=''用户'',max_length=32)
    email = models.EmailField(verbose_name=''邮件'')
    user_type = models.ForeignKey(verbose_name=''类型'',to=''UserType'',to_field=''id'')
    user_group = models.ManyToManyField(''UserGroup'')

class UserType(models.Model):
    caption = models.CharField(max_length=32)

    def __str__(self):          #打印名称,不写显示的是obj对象
        return self.caption

class UserGroup(models.Model):
    groupname = models.CharField(max_length=32)

    def __str__(self):          #打印名称,不写显示的是obj对象
        return self.groupname
model.py

user_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {% for row in list %}
            <p>{{ row.username }}--{{ row.user_type.caption }}--<a href="/edit-{{ row.id }}">编辑</a></p>
        {% endfor %}
    </ul>
</body>
</html>

user_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/edit-{{ nid }}" method="post">
        {% csrf_token %}
        {{ obj.as_p }}
        <input type="submit" value="提交" />
    </form>

</body>
</html>

views.py

from django.shortcuts import render,redirect
from app01 import models
from django import forms
from django.forms import fields
from django.forms import widgets as Fwidgets
from django.forms import fields as Ffields


class UserInfoModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo  # 去UserInfo类中获取数据
        fields = ''__all__''  # __all__ 代指所有字段
        labels = {''username'': ''用户名''}
        help_texts = {''username'': ''...''}
        widgets = {
            ''username'': Fwidgets.Textarea(attrs={''class'': ''c1''})
        }
        error_messages = {
            ''__all__'': {},  # 整体的错误信息
            ''email'': {''required'': ''邮箱不能为空''}
        }

def index(request):
    if request.method == ''GET'':
        obj = UserInfoModelForm()
        return render(request,''index.html'',{''obj'':obj})
    elif request.method == ''POST'':
        obj = UserInfoModelForm(request.POST)
        if obj.is_valid():
            # 验证成功直接保存
            obj.save()         #默认commit=True,会保存多对多
            # 保存一对多表单
            # instance = obj.save(commit=False)
            # instance.save()
            # 保存多对多数据
            # obj.save_m2m()
        return render(request,''index.html'',{''obj'':obj})


def user_list(request):
    if request.method == ''GET'':
        list = models.UserInfo.objects.all().select_related(''user_type'')
        return render(request, ''user_list.html'', {''list'': list})


def user_edit(request, nid):
    if request.method == ''GET'':
        user_obj = models.UserInfo.objects.filter(id=nid).first()
        obj = UserInfoModelForm(instance=user_obj)  # instance显示user_obj的对应值
        return render(request, ''user_edit.html'', {''obj'': obj, ''nid'': nid})
    elif request.method == ''POST'':
        user_obj = models.UserInfo.objects.filter(id=nid).first()
        obj = UserInfoModelForm(request.POST, instance=user_obj)  # instance更新user_obj而不是添加
        if obj.is_valid():
            # 验证成功直接更新
            obj.save()
        else:
            print(obj.errors.as_json())
        return render(request, ''user_edit.html'', {''obj'': obj, ''nid'': nid})

 

 
 
 

Django - Form和ModelForm

Django - Form和ModelForm

一. form介绍

  1.生成页面可用的HTML标签

  2. 提供input可以提交数据

  3. 对用户提交的数据进行校验

  4. 保留上次输入内容

  5. 提供错误信息

二. 普通方式书写注册功能

分享图片

分享图片

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
<form action="/reg/" method="post">
    {% csrf_token %}
    <p>
        用户名:
        <input type="text" name="name">
    </p>
    <p>
        密码:
        <input type="password" name="pwd">
    </p>
    <p>
        <input type="submit" value="注册">
        <p style="color: red">{{ error_msg }}</p>
    </p>
</form>
</body>
</html>
login.html

分享图片

分享图片

# 注册
def register(request):
    error_msg = ""
    if request.method == "POST":
        username = request.POST.get("name")
        pwd = request.POST.get("pwd")
        # 对注册信息做校验
        if len(username) < 6:
            # 用户长度小于6位
            error_msg = "用户名长度不能小于6位"
        else:
            # 将用户名和密码存到数据库
            return HttpResponse("注册成功")
    return render(request,"register.html",{"error_msg": error_msg})
Views.py

 

 

三.  使用form组件实现注册功能,自动创建表单

分享图片

分享图片

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>注册2</title>
</head>
<body>
    <form action="/reg2/" method="post" novalidate autocomplete="off">
        {% csrf_token %}
        <div>
            <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>
            {{ form_obj.name }} {{ form_obj.name.errors.0 }}
        </div>
        <div>
            <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
            {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
        </div>
        <div>
            <input type="submit" class="btn btn-success" value="注册">
        </div>
    </form>
</body>
</html>
login2.html

分享图片

分享图片

先定义好一个RegForm类:
from django import forms
# 按照Django form组件的要求自己写一个类
class RegForm(forms.Form):
    name = forms.CharField(label="用户名")
    pwd = forms.CharField(label="密码")

再写一个视图函数:
# 使用form组件实现注册方式
def register2(request):
    form_obj = RegForm()
    if request.method == "POST":
        # 实例化form对象的时候,把post提交过来的数据直接传进去
        form_obj = RegForm(request.POST)
        # 调用form_obj校验数据的方法
        if form_obj.is_valid():
            return HttpResponse("注册成功")
    return render(request,"register2.html",{"form_obj": form_obj})
Views.py  

四. form常用的字段和与插件

    创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

  1. 组件  

     视图中:

form_obj = RegForm()   # 实例化form对象
return render(request,‘reg2.html‘,{‘form_obj‘: form_obj})

     模板中:

        form标签加上novalidate 前段不进行校验

复制代码

{{ form_obj.as_p }}   ——》  生成所有的p标签   label  input
{{ form_obj.errors }}   ——》所有字段的错误
{{ form_obj.user }}   ——》 该字段的input框
{{ form_obj.user.label }}   ——》 该字段的label  中文提示
{{ form_obj.user.id_for_label }}   ——》 该字段的id
{{ form_obj.user.errors }}   ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息

复制代码

 

  2. 字段

initial:  初始值,input框里面的初始值,默认值

分享图片

复制代码

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,label="用户名",initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6,label="密码")

复制代码

  error_messages:  重写错误信息

分享图片

复制代码

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,initial="张三",error_messages={
            "required": "不能为空","invalid": "格式错误","min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6,label="密码")

复制代码

  passwod:  密码

分享图片

复制代码

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,label="密码",widget=forms.widgets.PasswordInput(attrs={‘class‘: ‘c1‘},render_value=True)
    )

复制代码

  radioSelect:  单radio值为字符串

分享图片

复制代码

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,label="密码")
    gender = forms.fields.ChoiceField(
        choices=((1,"男"),(2,"女"),(3,"保密")),label="性别",initial=3,widget=forms.widgets.RadioSelect()
    )

复制代码

  select

分享图片

复制代码

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.ChoiceField(
        choices=((1,"篮球"),"足球"),"双色球"),),label="爱好",widget=forms.widgets.Select()
    )

复制代码

分享图片

复制代码

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1,initial=[1,3],widget=forms.widgets.SelectMultiple()
    )

复制代码

  checkBox

分享图片

复制代码

class LoginForm(forms.Form):
    ...
    keep = forms.fields.ChoiceField(
        label="是否记住密码",initial="checked",widget=forms.widgets.CheckBoxinput()
    )

复制代码

分享图片

复制代码

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1,widget=forms.widgets.CheckBoxSelectMultiple()
    )

复制代码

  关于choise的注意事项:

  在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

分享图片

复制代码

from django.forms import Form
from django.forms import widgets
from django.forms import fields

 
class MyForm(Form):
 
    user = fields.ChoiceField(
        # choices=((1,‘上海‘),‘北京‘),initial=2,widget=widgets.Select
    )
 
    def __init__(self,*args,**kwargs):
        super(MyForm,self).__init__(*args,**kwargs)
        # self.fields[‘user‘].choices = ((1,)
        # 或
        self.fields[‘user‘].choices = models.Classes.objects.all().values_list(‘id‘,‘caption‘)

复制代码

分享图片

复制代码

from django import forms
from django.forms import fields
from django.forms import models as form_model

 
class FInfo(forms.Form):
    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选
    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选

复制代码

 

  3. Django Form所有内置字段

分享图片

复制代码

Field
    required=True,是否允许为空
    widget=None,HTML插件
    label=None,用于生成Label标签或显示内容
    initial=None,初始值
    help_text=‘‘,帮助信息(在标签旁边显示)
    error_messages=None,错误信息 {‘required‘: ‘不能为空‘,‘invalid‘: ‘格式错误‘}
    validators=[],自定义验证规则
    localize=False,是否支持本地化
    disabled=False,是否可以编辑
    label_suffix=None            Label内容后缀
 
 
CharField(Field)
    max_length=None,最大长度
    min_length=None,最小长度
    strip=True                   是否移除用户输入空白
 
IntegerField(Field)
    max_value=None,最大值
    min_value=None,最小值
 
FloatField(IntegerField)
    ...
 
DecimalField(IntegerField)
    max_value=None,最小值
    max_digits=None,总长度
    decimal_places=None,小数位长度
 
BaseTemporalField(Field)
    input_formats=None          时间格式化   
 
DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
 
DurationField(Field)            时间间隔:%d %H:%M:%s.%f
    ...
 
RegexField(CharField)
    regex,自定制正则表达式
    max_length=None,最小长度
    error_message=None,忽略,错误信息使用 error_messages={‘invalid‘: ‘...‘}
 
EmailField(CharField)      
    ...
 
FileField(Field)
    allow_empty_file=False     是否允许空文件
 
ImageField(FileField)      
    ...
    注:需要PIL模块,pip3 install Pillow
    以上两个字典使用时,需要注意两点:
        - form表单中 enctype="multipart/form-data"
        - view函数中 obj = MyForm(request.POST,request.FILES)
 
URLField(Field)
    ...
 
 
BooleanField(Field)  
    ...
 
NullBooleanField(BooleanField)
    ...
 
ChoiceField(Field)
    ...
    choices=(),选项,如:choices = ((0,(1,)
    required=True,是否必填
    widget=None,插件,默认select插件
    label=None,Label内容
    initial=None,帮助提示
 
 
ModelChoiceField(ChoiceField)
    ...                        django.forms.models.ModelChoiceField
    queryset,# 查询数据库中的数据
    empty_label="---------",# 默认空显示内容
    to_field_name=None,# HTML中value的值对应的字段
    limit_choices_to=None      # ModelForm中对queryset二次筛选
     
ModelMultipleChoiceField(ModelChoiceField)
    ...                        django.forms.models.ModelMultipleChoiceField
 
 
     
TypedChoiceField(ChoiceField)
    coerce = lambda val: val   对选中的值进行一次转换
    empty_value= ‘‘            空值的默认值
 
MultipleChoiceField(ChoiceField)
    ...
 
TypedMultipleChoiceField(MultipleChoiceField)
    coerce = lambda val: val   对选中的每一个值进行一次转换
    empty_value= ‘‘            空值的默认值
 
ComboField(Field)
    fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                               fields.ComboField(fields=[fields.CharField(max_length=20),fields.EmailField(),])
 
MultiValueField(Field)
    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
 
SplitDateTimeField(MultiValueField)
    input_date_formats=None,格式列表:[‘%Y--%m--%d‘,‘%m%d/%Y‘,‘%m/%d/%y‘]
    input_time_formats=None    格式列表:[‘%H:%M:%s‘,‘%H:%M:%s.%f‘,‘%H:%M‘]
 
FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中
    path,文件夹路径
    match=None,正则匹配
    recursive=False,递归下面的文件夹
    allow_files=True,允许文件
    allow_folders=False,允许文件夹
    required=True,widget=None,label=None,initial=None,help_text=‘‘
 
GenericIPAddressField
    protocol=‘both‘,both,ipv4,ipv6支持的IP格式
    unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
 
SlugField(CharField)           数字,字母,下划线,减号(连字符)
    ...
 
UUIDField(CharField)           uuid类型

复制代码

 

五. 校验

  1. 内置校验

    required=True,min_length=8,max_length=12,

分享图片

复制代码

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
 
class MyForm(Form):
    user = fields.CharField(
        validators=[RegexValidator(r‘^[0-9]+$‘,‘请输入数字‘),RegexValidator(r‘^159[0-9]+$‘,‘数字必须以159开头‘)],)

复制代码

  2. 自定义校验器

    定义函数

分享图片

复制代码

import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError
 
 
# 自定义验证规则
def mobile_validate(value):
    mobile_re = re.compile(r‘^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$‘)
    if not mobile_re.match(value):
        raise ValidationError(‘手机号码格式错误‘)
 
 
class PublishForm(Form):
 
 
    title = fields.CharField(max_length=20,min_length=5,error_messages={‘required‘: ‘标题不能为空‘,‘min_length‘: ‘标题最少为5个字符‘,‘max_length‘: ‘标题最多为20个字符‘},widget=widgets.TextInput(attrs={‘class‘: "form-control",‘placeholder‘: ‘标题5-20个字符‘}))
 
 
    # 使用自定义验证规则
    phone = fields.CharField(validators=[mobile_validate,],error_messages={‘required‘: ‘手机不能为空‘},‘placeholder‘: u‘手机号码‘}))
 
    email = fields.EmailField(required=False,error_messages={‘required‘: u‘邮箱不能为空‘,‘invalid‘: u‘邮箱格式错误‘},‘placeholder‘: u‘邮箱‘}))

复制代码

 

复制代码

from django.core.exceptions import ValidationError
def check(value):
    if ‘alex‘ in value:
        raise ValidationError(‘敏感词汇,不符合社会职业核心价值观‘)
validators=[check]

复制代码

 

  3. 局部钩子

    定义一个放法 clean_字段名(self,)的方法,如果不通过校验规则,要抛出异常ValidationError,如果通过校验规则,返回通过校验的值

def clean_user(self):
    value = self.cleaned_data.get(‘user‘)
    if ‘alex‘ in value:
        raise ValidationError(‘敏感词汇,不符合社会职业核心价值观‘)
    return value

 

  4. 全局钩子

    定义一个放法 clean(self)的方法,如果不通过校验规则,要抛出异常ValidationError,还可以自己使用self.add_error(‘re_pwd‘,‘两次密码不一致[email protected]!‘)添加错误信息。如果通过校验规则,返回所有通过校验的值

复制代码

ef clean(self):
    pwd = self.cleaned_data.get(‘pwd‘)
    re_pwd = self.cleaned_data.get(‘re_pwd‘)

    if pwd != re_pwd:
        self.add_error(‘re_pwd‘,‘两次密码不一致[email protected]!‘)
        raise ValidationError(‘两次密码不一致‘)

    return self.cleaned_data

复制代码

 

 

 

ModeForm

 

通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单。 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中。 在这种情况下,在form表单中定义字段将是冗余的,因为我们已经在模型中定义了那些字段。

 

基于这个原因,Django 提供一个辅助类来让我们可以从Django 的模型创建Form,这就是ModelForm。

 

modelForm定义

 

form与model的终极结合。

 

复制代码

复制代码

class BookForm(forms.ModelForm):

    class Meta:
        model = models.Book
        fields = "__all__"
        labels = {
            "title": "书名","price": "价格"
        }
        widgets = {
            "password": forms.widgets.PasswordInput(attrs={"class": "c1"}),}

复制代码

复制代码

 

class Meta下常用参数:

 

复制代码

复制代码

model = models.Book  # 对应的Model中的类
fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
exclude = None  # 排除的字段
labels = None  # 提示信息
help_texts = None  # 帮助提示信息
widgets = None  # 自定义插件
error_messages = None  # 自定义错误信息

复制代码

复制代码

 

ModelForm的验证

 

与普通的Form表单验证类型类似,ModelForm表单的验证在调用is_valid() 或访问errors 属性时隐式调用。

 

我们可以像使用Form类一样自定义局部钩子方法和全局钩子方法来实现自定义的校验规则。

 

如果我们不重写具体字段并设置validators属性的化,ModelForm是按照模型中字段的validators来校验的。

 

save()方法

 

每个ModelForm还具有一个save()方法。 这个方法根据表单绑定的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供此功能,则save()将更新该实例。 如果没有提供,save() 将创建模型的一个新实例:

 

复制代码

复制代码

>>> from myapp.models import Book
>>> from myapp.forms import BookForm

# 根据POST数据创建一个新的form对象
>>> form_obj = BookForm(request.POST)

# 创建书籍对象
>>> new_ book = form_obj.save()

# 基于一个书籍对象创建form对象
>>> edit_obj = Book.objects.get(id=1)
# 使用POST提交的数据更新书籍对象
>>> form_obj = BookForm(request.POST,instance=edit_obj)
>>> form_obj.save()

Django 11 form 表单(状态保持 session、form 表单及注册实现)

Django 11 form 表单(状态保持 session、form 表单及注册实现)

 

Django 11 form 表单(状态保持 session、form 表单及注册实现)

一、状态保持 session

  状态保持

#1、http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
#2、客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端储存与会话有关的数据
#3、储存方式包括cookie、session,会话一般指session
#4、使用cookie,所有数据存储在客户端,注意不要存储敏感数据
#5、是由session方式,所有数据存储在服务器端,在客户端cookie中存储session_id
#6、状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据

#注意:不同请求者之间不会共享这个数据,与请求者一一对应

  使用 session

#启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象

-get(key,default=None) #根据键获取会话的值
-clear() #清除所有会话
-flush() #删除当前的会话数据并删除会话的cookie
-del request.session[''member_id'']- #删除

  会话过期时间

#1、代码中配置
#set_expiry(value)表示设置会话的过期时间;如果没有指定,默认为两星期后过期
#如果value是一个整数,则回家整数秒后过期;如果value是一个imedelta对象,会话将会在当前时间加上这个指定的日期/时间过期
#如果value是0,那么用户会话的cookie将会在用户的浏览器关闭时过期;如果value为None,那么会话永不过期

#2、配置文件settings里面配置
#是否关闭浏览器使得session过期,默认为False
SESSION_EXPIRY_AT_BROWSER_CLOSE = False

#是否每次请求都保存session,默认修改之后保存
SESSION_SAVE_EVERY_REQUEST = False

#session的cookie失效时间,默认为2周
SESSION_COOKIE_AGE = 1209600
from django.shortcuts import render,redirect,reverse

# Create your views here.


def home(request):
    ''''''
    主页
    ''''''
    username = request.session.get(''username'',''未登录'') #在登录的时候设置了session,这里就用session来获取用户信息
    return render(request,''test22/home.html'',
                  context={''username'':username})

def login_test(request):
    ''''''
    登录页
    ''''''
    if request.method == ''GET'':
        return render(request,''test22/login.html'')
    elif request.method == ''POST'':
        username = request.POST.get(''username'') #获取POST中的username
        request.session[''username''] = username #session是一个字典对象,直接传值便可以存入数据
        request.session.set_expiry(0) #set_expiry(value)表示设置会话的过期时间;如果没有指定,默认为两星期后过期
            #如果value是一个整数,则回家整数秒后过期;如果value是一个imedelta对象,会话将会在当前时间加上这个指定的日期/时间过期
            #如果value是0,那么用户会话的cookie将会在用户的浏览器关闭时过期;如果value为None,那么会话永不过期
        return redirect(reverse(''test22_home''))


def logout(request):
    ''''''
    退出
    ''''''
    request.session.flush()
    return redirect(reverse(''test22_home''))

二、form 表单及注册实现

  form 表单的引用

#登录页面和注册页面都会用form表单来提交数据

#当数据提交到后台去,都需要在视图函数中去验证数据的合法性

#django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性,还可以用来生成html代码(生成代码功能基本不用)

  关于 django form 表单的使用

#1、创建一个forms.py的文件,放到指定的app中,然后在里面写表单

#2、表单是通过类实现的,继承自formsForm,然后在里面定义要验证的字段

#3、在表单中,创建字段和模型是一模一样的,但是没有null=True或者blank=True等这几种参数了,有的参数是required=True/False

#4、使用is_valid()方法可以验证用户提交的数据是否合法,而且HTML表单元素的name必须和django中的表单的name保持一致,否则匹配不到

#5、is_bound属性  用来表示form是否绑定了数据,如果绑定了,则返回True,否则返回False

#6、cleaned_data  这个实在is_vaild()返回True的时候,保存用户提交上来的数据

  form.py

from django import forms

class AddForm(forms.Form):
    first = forms.IntegerField()
    second = forms.IntegerField()


class RegisterForm(forms.Form):
    username = forms.CharField(max_length=20,min_length=6)
    password = forms.CharField(max_length=10,min_length=6,
                               widget=forms.PasswordInput( #width、attrs、error_message是前端的内容
                                   attrs={''placeholder'':''请输入密码''}
                               ),
                               error_messages={''min_length'':''密码长度小于6'',
                                               ''max_length'':''密码长度大于10''}
                               )
    password_repeat = forms.CharField(widget=forms.PasswordInput())
    email = forms.EmailField()

class LoginForm(forms.Form):
    username = forms.CharField(max_length=20,min_length=6)
    password = forms.CharField(max_length=10,min_length=6)

  view.py

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
from django.contrib.auth.hashers import make_password,check_password
# Create your views here.

from .forms import AddForm,RegisterForm,LoginForm
from .models import User
def add_test(request):
    if request.method == ''GET'':
        form = AddForm()
        return render(request,''test22/add_test.html'',
                      context={''form'':form, #这就是模型渲染到模板中
                               })
    elif request.method == ''POST'':
        form = AddForm(request.POST)   #把POST的值放到AddForm类当中去,然后在赋值给form,就是拿到POST的值
        if form.is_valid():  #判断是否合法
            first = form.cleaned_data.get(''first'')  #通过cleaned_data方法获取,这也是一个字典类型的,可以用get拿到数据
            second = form.cleaned_data.get(''second'')
            return HttpResponse(first*second)

def register(request):
    ''''''
    注册页
    ''''''
    if request.method == ''GET'':
        form = RegisterForm()
        return render(request,''test22/register.html'',
                      context={''form'':form})
    elif request.method == ''POST'':
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get(''username'')
            password = form.cleaned_data.get(''password'')
            password_repeat = form.cleaned_data.get(''password_repeat'')
            email = form.cleaned_data.get(''email'')
            if password == password_repeat:
                password = make_password(password) #给用户输入的密码加密
                User.objects.create(username = username,
                                    password = password,
                                    email = email)
                return render(request,''test22/login.html'')
            else:
                return HttpResponse(''注册失败'')
        else:
            return HttpResponse(''注册失败'')

def login(requset):
    ''''''
    登录页
    ''''''
    if requset.method == ''GET'':
        form = LoginForm()
        return render(requset,''test22/login.html'',
                      context={''form'':form})
    elif requset.method == ''POST'':
        form = LoginForm(requset.POST)
        if form.is_valid():
            username = form.cleaned_data.get(''username'')
            password = form.cleaned_data.get(''password'')
            user = User.objects.filter(username=username) #查询数据库中名字为username的数据
            if user:#如果存在
                if check_password(password,user[0].password): #验证POST中的密码和数据库中的密码是否相同,相同,session;不同,返回登录页面
                    requset.session[''username''] = username
                    return render(requset,''test22/home.html'')
                else:
                    redirect(reverse(''login''))
            else:
                return redirect(reverse(''login''))
        else:
            return redirect(reverse(''login''))

 

Django Form and ModelForm

Django Form and ModelForm

Form介绍 

在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。

与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。

Django form组件就实现了上面所述的功能。

总结一下,其实form组件的主要功能如下:

普通方式手写注册功能

views.py

# 注册
def register(request):
    error_msg = ""
    if request.method == "POST":
        username = request.POST.get("name")
        pwd = request.POST.get("pwd")
        # 对注册信息做校验
        if len(username) < 6:
            # 用户长度小于6位
            error_msg = "用户名长度不能小于6位"
        else:
            # 将用户名和密码存到数据库
            return HttpResponse("注册成功")
    return render(request, "register.html", {"error_msg": error_msg})

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>
<form action="/reg/" method="post">
    {% csrf_token %}
    <p>
        用户名:
        <input type="text" name="name">
    </p>
    <p>
        密码:
        <input type="password" name="pwd">
    </p>
    <p>
        <input type="submit" value="注册">
        <p style="color: red">{{ error_msg }}</p>
    </p>
</form>
</body>
</html>

使用form组件实现注册功能

views.py

先定义好一个RegForm类:

from django import forms

# 按照Django form组件的要求自己写一个类
class RegForm(forms.Form):
    name = forms.CharField(label="用户名")
    pwd = forms.CharField(label="密码")

再写一个视图函数:

# 使用form组件实现注册方式
def register2(request):
    form_obj = RegForm()
    if request.method == "POST":
        # 实例化form对象的时候,把post提交过来的数据直接传进去
        form_obj = RegForm(request.POST)
        # 调用form_obj校验数据的方法
        if form_obj.is_valid():
            return HttpResponse("注册成功")
    return render(request, "register2.html", {"form_obj": form_obj})

login2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册2</title>
</head>
<body>
    <form action="/reg2/" method="post" novalidate autocomplete="off">
        {% csrf_token %}
        <div>
            <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>
            {{ form_obj.name }} {{ form_obj.name.errors.0 }}
        </div>
        <div>
            <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
            {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
        </div>
        <div>
            <input type="submit" class="btn btn-success" value="注册">
        </div>
    </form>
</body>
</html>

 

看网页效果发现 也验证了form的功能:
• 前端页面是form类的对象生成的                                      -->生成HTML标签功能
• 当用户名和密码输入为空或输错之后 页面都会提示        -->用户提交校验功能
• 当用户输错之后 再次输入 上次的内容还保留在input框   -->保留上次输入内容

Form那些事儿

常用字段与插件

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

initial

初始值,input框里面的初始值。

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三"  # 设置默认值
    )
    pwd = forms.CharField(min_length=6, label="密码")

error_messages

重写错误信息。

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")

password

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="密码",
        widget=forms.widgets.PasswordInput(attrs={''class'': ''c1''}, render_value=True)
    )

radioSelect

单radio值为字符串

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密码")
    gender = forms.fields.ChoiceField(
        choices=((1, ""), (2, ""), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )

单选Select

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.ChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=3,
        widget=forms.widgets.Select()
    )

多选Select

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"), ),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
    )

单选checkbox

class LoginForm(forms.Form):
    ...
    keep = forms.fields.ChoiceField(
        label="是否记住密码",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
    )

多选checkbox

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
        label="爱好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
    )

choice字段注意事项

在使用选择标签时,需要注意choices的选项可以配置从数据库中获取,但是由于是静态字段 获取的值无法实时更新,需要重写构造方法从而实现choice实时更新。

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields

 
class MyForm(Form):
 
    user = fields.ChoiceField(
        # choices=((1, ''上海''), (2, ''北京''),),
        initial=2,
        widget=widgets.Select
    )
 
    def __init__(self, *args, **kwargs):
        super(MyForm,self).__init__(*args, **kwargs)
        # self.fields[''user''].choices = ((1, ''上海''), (2, ''北京''),)
        #
        self.fields[''user''].choices = models.Classes.objects.all().values_list(''id'',''caption'')

方式二:

from django import forms
from django.forms import fields
from django.forms import models as form_model

 
class FInfo(forms.Form):
    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多选
    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 单选

Django Form所有内置字段

Field
    required=True,               是否允许为空
    widget=None,                 HTML插件
    label=None,                  用于生成Label标签或显示内容
    initial=None,                初始值
    help_text='''',                帮助信息(在标签旁边显示)
    error_messages=None,         错误信息 {''required'': ''不能为空'', ''invalid'': ''格式错误''}
    validators=[],               自定义验证规则
    localize=False,              是否支持本地化
    disabled=False,              是否可以编辑
    label_suffix=None            Label内容后缀
 
 
CharField(Field)
    max_length=None,             最大长度
    min_length=None,             最小长度
    strip=True                   是否移除用户输入空白
 
IntegerField(Field)
    max_value=None,              最大值
    min_value=None,              最小值
 
FloatField(IntegerField)
    ...
 
DecimalField(IntegerField)
    max_value=None,              最大值
    min_value=None,              最小值
    max_digits=None,             总长度
    decimal_places=None,         小数位长度
 
BaseTemporalField(Field)
    input_formats=None          时间格式化   
 
DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
 
DurationField(Field)            时间间隔:%d %H:%M:%S.%f
    ...
 
RegexField(CharField)
    regex,                      自定制正则表达式
    max_length=None,            最大长度
    min_length=None,            最小长度
    error_message=None,         忽略,错误信息使用 error_messages={''invalid'': ''...''}
 
EmailField(CharField)      
    ...
 
FileField(Field)
    allow_empty_file=False     是否允许空文件
 
ImageField(FileField)      
    ...
    注:需要PIL模块,pip3 install Pillow
    以上两个字典使用时,需要注意两点:
        - form表单中 enctype="multipart/form-data"
        - view函数中 obj = MyForm(request.POST, request.FILES)
 
URLField(Field)
    ...
 
 
BooleanField(Field)  
    ...
 
NullBooleanField(BooleanField)
    ...
 
ChoiceField(Field)
    ...
    choices=(),                选项,如:choices = ((0,''上海''),(1,''北京''),)
    required=True,             是否必填
    widget=None,               插件,默认select插件
    label=None,                Label内容
    initial=None,              初始值
    help_text='''',              帮助提示
 
 
ModelChoiceField(ChoiceField)
    ...                        django.forms.models.ModelChoiceField
    queryset,                  # 查询数据库中的数据
    empty_label="---------",   # 默认空显示内容
    to_field_name=None,        # HTML中value的值对应的字段
    limit_choices_to=None      # ModelForm中对queryset二次筛选
     
ModelMultipleChoiceField(ModelChoiceField)
    ...                        django.forms.models.ModelMultipleChoiceField
 
 
     
TypedChoiceField(ChoiceField)
    coerce = lambda val: val   对选中的值进行一次转换
    empty_value= ''''            空值的默认值
 
MultipleChoiceField(ChoiceField)
    ...
 
TypedMultipleChoiceField(MultipleChoiceField)
    coerce = lambda val: val   对选中的每一个值进行一次转换
    empty_value= ''''            空值的默认值
 
ComboField(Field)
    fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
 
MultiValueField(Field)
    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
 
SplitDateTimeField(MultiValueField)
    input_date_formats=None,   格式列表:[''%Y--%m--%d'', ''%m%d/%Y'', ''%m/%d/%y'']
    input_time_formats=None    格式列表:[''%H:%M:%S'', ''%H:%M:%S.%f'', ''%H:%M'']
 
FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中
    path,                      文件夹路径
    match=None,                正则匹配
    recursive=False,           递归下面的文件夹
    allow_files=True,          允许文件
    allow_folders=False,       允许文件夹
    required=True,
    widget=None,
    label=None,
    initial=None,
    help_text=''''
 
GenericIPAddressField
    protocol=''both'',           both,ipv4,ipv6支持的IP格式
    unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
 
SlugField(CharField)           数字,字母,下划线,减号(连字符)
    ...
 
UUIDField(CharField)           uuid类型
Django Form内置字段

字段校验

RegexValidator验证器

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
 
class MyForm(Form):
    user = fields.CharField(
        validators=[RegexValidator(r''^[0-9]+$'', ''请输入数字''), RegexValidator(r''^159[0-9]+$'', ''数字必须以159开头'')],
    )

自定义验证函数

import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError
 
 
# 自定义验证规则
def mobile_validate(value):
    mobile_re = re.compile(r''^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$'')
    if not mobile_re.match(value):
        raise ValidationError(''手机号码格式错误'')
 
 
class PublishForm(Form):
 
 
    title = fields.CharField(max_length=20,
                            min_length=5,
                            error_messages={''required'': ''标题不能为空'',
                                            ''min_length'': ''标题最少为5个字符'',
                                            ''max_length'': ''标题最多为20个字符''},
                            widget=widgets.TextInput(attrs={''class'': "form-control",
                                                          ''placeholder'': ''标题5-20个字符''}))
 
 
    # 使用自定义验证规则
    phone = fields.CharField(validators=[mobile_validate, ],
                            error_messages={''required'': ''手机不能为空''},
                            widget=widgets.TextInput(attrs={''class'': "form-control",
                                                          ''placeholder'': u''手机号码''}))
 
    email = fields.EmailField(required=False,
                            error_messages={''required'': u''邮箱不能为空'',''invalid'': u''邮箱格式错误''},
                            widget=widgets.TextInput(attrs={''class'': "form-control", ''placeholder'': u''邮箱''}))

Hook方法

除了上面两种方式,我们还可以在Form类中定义钩子函数,来实现自定义的验证功能。

局部钩子

我们在Fom类中定义 clean_字段名() 方法,就能够实现对特定字段进行校验。

举个例子:

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        },
        widget=forms.widgets.TextInput(attrs={"class": "form-control"})
    )
    ...
    # 定义局部钩子,用来校验username字段
    def clean_username(self):
        value = self.cleaned_data.get("username")
        if "666" in value:
            raise ValidationError("光喊666是不行的")
        else:
            return value

全局钩子

我们在Fom类中定义 clean() 方法,就能够实现对字段进行全局校验。

class LoginForm(forms.Form):
    ...
    password = forms.CharField(
        min_length=6,
        label="密码",
        widget=forms.widgets.PasswordInput(attrs={''class'': ''form-control''}, render_value=True)
    )
    re_password = forms.CharField(
        min_length=6,
        label="确认密码",
        widget=forms.widgets.PasswordInput(attrs={''class'': ''form-control''}, render_value=True)
    )
    ...
    # 定义全局的钩子,用来校验密码和确认密码字段是否相同
    def clean(self):
        password_value = self.cleaned_data.get(''password'')
        re_password_value = self.cleaned_data.get(''re_password'')
        if password_value == re_password_value:
            return self.cleaned_data
        else:
            self.add_error(''re_password'', ''两次密码不一致'')
            raise ValidationError(''两次密码不一致'')

 

补充进阶

应用Bootstrap样式

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
  <title>login</title>
</head>
<body>
<div class="container">
  <div class="row">
    <form action="/login2/" method="post" novalidate class="form-horizontal">
      {% csrf_token %}
      <div class="form-group">
        <label for="{{ form_obj.username.id_for_label }}"
               class="col-md-2 control-label">{{ form_obj.username.label }}</label>
        <div class="col-md-10">
          {{ form_obj.username }}
          <span class="help-block">{{ form_obj.username.errors.0 }}</span>
        </div>
      </div>
      <div class="form-group">
        <label for="{{ form_obj.pwd.id_for_label }}" class="col-md-2 control-label">{{ form_obj.pwd.label }}</label>
        <div class="col-md-10">
          {{ form_obj.pwd }}
          <span class="help-block">{{ form_obj.pwd.errors.0 }}</span>
        </div>
      </div>
      <div class="form-group">
      <label class="col-md-2 control-label">{{ form_obj.gender.label }}</label>
        <div class="col-md-10">
          <div class="radio">
            {% for radio in form_obj.gender %}
              <label for="{{ radio.id_for_label }}">
                {{ radio.tag }}{{ radio.choice_label }}
              </label>
            {% endfor %}
          </div>
        </div>
      </div>
      <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
          <button type="submit" class="btn btn-default">注册</button>
        </div>
      </div>
    </form>
  </div>
</div>

<script src="/static/jquery-3.2.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
Django form应用Bootstrap样式简单示例

批量添加样式

可通过重写form类的init方法来实现。

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用户名",
        initial="张三",
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短8位"
        }
    ...

    def __init__(self, *args, **kwargs):
        super(LoginForm, self).__init__(*args, **kwargs)
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                ''class'': ''form-control''
            })
批量添加样式

ModelForm

通常在Django项目中,我们编写的大部分都是与Django 的模型紧密映射的表单。 举个例子,你也许会有个Book 模型,并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中。 在这种情况下,在form表单中定义字段将是冗余的,因为我们已经在模型中定义了那些字段。

基于这个原因,Django 提供一个辅助类来让我们可以从Django 的模型创建Form,这就是ModelForm。

modelForm定义

form与model的终极结合。

class BookForm(forms.ModelForm):

    class Meta:
        model = models.Book
        fields = "__all__"
        labels = {
            "title": "书名",
            "price": "价格"
        }
        widgets = {
            "password": forms.widgets.PasswordInput(attrs={"class": "c1"}),
        }
class StudentList(ModelForm):
    class Meta:
        model = models.UserInfo  #对应的Model中的类
        fields = "__all__"      #字段,如果是__all__,就是表示列出所有的字段
        exclude = None          #排除的字段
        labels = None           #提示信息
        help_texts = None       #帮助提示信息
        widgets = None          #自定义插件
        error_messages = None   #自定义错误信息
        #error_messages用法:
        error_messages = {
            ''name'':{''required'':"用户名不能为空",},
            ''age'':{''required'':"年龄不能为空",},
        }

        #widgets用法,比如把输入用户名的input框给为Textarea
        #首先得导入模块
        from django.forms import widgets as wid  #因为重名,所以起个别名
        widgets = {
            "name":wid.Textarea(attrs={"class":"c1"}) #还可以自定义属性
        }
        #labels,自定义在前端显示的名字
        labels= {
            "name":"用户名"
参数用法

class Meta下常用参数:

model = models.Book  # 对应的Model中的类
fields = "__all__"  # 字段,如果是__all__,就是表示列出所有的字段
exclude = None  # 排除的字段
labels = None  # 提示信息
help_texts = None  # 帮助提示信息
widgets = None  # 自定义插件
error_messages = None  # 自定义错误信息

ModelForm的验证

与普通的Form表单验证类型类似,ModelForm表单的验证在调用is_valid() 或访问errors 属性时隐式调用。

我们可以像使用Form类一样自定义局部钩子方法和全局钩子方法来实现自定义的校验规则。

如果我们不重写具体字段并设置validators属性的化,ModelForm是按照模型中字段的validators来校验的。

save()方法

每个ModelForm还具有一个save()方法。 这个方法根据表单绑定的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供此功能,则save()将更新该实例。 如果没有提供,save() 将创建模型的一个新实例:

>>> from myapp.models import Book
>>> from myapp.forms import BookForm

# 根据POST数据创建一个新的form对象
>>> form_obj = BookForm(request.POST)

# 创建书籍对象
>>> new_ book = form_obj.save()

# 基于一个书籍对象创建form对象
>>> edit_obj = Book.objects.get(id=1)
# 使用POST提交的数据更新书籍对象
>>> form_obj = BookForm(request.POST, instance=edit_obj)
>>> form_obj.save()

原文出处:https://www.cnblogs.com/pungchur/p/11988350.html

关于Django 用 ModelForm 批量保存 form 表单非常实用的方法 mfor_verity 项目的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于10.Django ModelForm、Django - Form和ModelForm、Django 11 form 表单(状态保持 session、form 表单及注册实现)、Django Form and ModelForm等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇docker - 基础命令(docker基础命令)

下一篇CaffeMFC:caffe.pb.h(2525): error C2059: syntax error : ''constant''