• django学习


    django自学网址:https://code.ziqiangxuetang.com/django/django-qrcode.html

    from的功能:

    • 生成HTML标签
    • 验证用户数据(显示错误信息)
    • HTML Form提交保留上次提交数据
    • 初始化页面显示内容
    • 创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
    • Field
          required=True,               是否允许为空
          widget=None,                 HTML插件
          label=None,                  用于生成Label标签或显示内容
          initial=None,                初始值
          help_text='',                帮助信息(在标签旁边显示)
          error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
          show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
          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内置插件:

    TextInput(Input)
    NumberInput(TextInput)
    EmailInput(TextInput)
    URLInput(TextInput)
    PasswordInput(TextInput)
    HiddenInput(TextInput)
    Textarea(Widget)
    DateInput(DateTimeBaseInput)
    DateTimeInput(DateTimeBaseInput)
    TimeInput(DateTimeBaseInput)
    CheckboxInput
    Select
    NullBooleanSelect
    SelectMultiple
    RadioSelect
    CheckboxSelectMultiple
    FileInput
    ClearableFileInput
    MultipleHiddenInput
    SplitDateTimeWidget
    SplitHiddenDateTimeWidget
    SelectDateWidget
    

      常用插件

    # 单radio,值为字符串
    # user = fields.CharField(
    #     initial=2,
    #     widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
    # )
     
    # 单radio,值为字符串
    # user = fields.ChoiceField(
    #     choices=((1, '上海'), (2, '北京'),),
    #     initial=2,
    #     widget=widgets.RadioSelect
    # )
     
    # 单select,值为字符串
    # user = fields.CharField(
    #     initial=2,
    #     widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
    # )
     
    # 单select,值为字符串
    # user = fields.ChoiceField(
    #     choices=((1, '上海'), (2, '北京'),),
    #     initial=2,
    #     widget=widgets.Select
    # )
     
    # 多选select,值为列表
    # user = fields.MultipleChoiceField(
    #     choices=((1,'上海'),(2,'北京'),),
    #     initial=[1,],
    #     widget=widgets.SelectMultiple
    # )
     
     
    # 单checkbox
    # user = fields.CharField(
    #     widget=widgets.CheckboxInput()
    # )
     
     
    # 多选checkbox,值为列表
    # user = fields.MultipleChoiceField(
    #     initial=[2, ],
    #     choices=((1, '上海'), (2, '北京'),),
    #     widget=widgets.CheckboxSelectMultiple
    

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

     

    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.ChoiceField(
            # choices=((1, '上海'), (2, '北京'),),
            initial=2,
            widget=widgets.Select
        )
     
        def __init__(self, *args, **kwargs):
            super(MyForm,self).__init__(*args, **kwargs)
            # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
            # 或
            self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')
    

      

    modelfrom:



    ModelForm a.
    class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 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={...})

     自定义验证标准

    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开头')],
    

      

    ModelForm
       
     a.  class Meta:
                model,                           # 对应Model的
                fields=None,                     # 字段
                exclude=None,                    # 排除字段
                labels=None,                     # 提示信息
                help_texts=None,                 # 帮助提示信息
                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={...})
    

      ajax:(原生ajax)网址

    http://www.cnblogs.com/wupeiqi/articles/5703697.html
    

      

     
     a.  class Meta:
                model,                           # 对应Model的
                fields=None,                     # 字段
                exclude=None,                    # 排除字段
                labels=None,                     # 提示信息
                help_texts=None,                 # 帮助提示信息
                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={...})

    1.工程下建立APP(以WIN10+PYTHON3.6为例)

    C:UsersWYS>django-admin startproject myweb  #建立项目
    C:UsersWYS>cd myweb
    C:UsersWYSmyweb>django-admin startapp myapp #建立项目下属APP

    2.APP下的models.py文件中加入表结构(django中之所以把表结构在自身文件中定义,是为了在其他文件中可直接引用表结构进行数据库操作,不用频繁刷新数据表获取表结构)

    复制代码
    from django.db import models
    
    # Create your models here.
    
    class book_info(models.Model):
        fromuser = models.CharField(max_length=30, default='WYS')
        fromsite = models.CharField(max_length=50)
        bookname = models.CharField(max_length=50)
        #updatetime = models.DateTimeField()
        #lastchapter = models.CharField(max_length=100)
    
    class site_info(models.Model):
        sitename = models.CharField(max_length=50)
        bookname = models.CharField(max_length=50)
        url = models.CharField(max_length=200)
        updatetime = models.DateTimeField()
        lastchapter = models.CharField(max_length=100)
    复制代码

    3.在myweb/myweb/settings.py中加入创建的APP和MYSQL连接信息

    复制代码
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'myapp',
    )
    复制代码
    复制代码
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test',
            'USER': 'test',
            'PASSWORD': 'test',
            'HOST': 'localhost',
            'PORT': '3306',
        }
    }
    复制代码

    4.将models.py中的数据库表结构同步到MYSQL中

    C:UsersWYSmyweb>python manage.py migrate #创建表结构
    C:UsersWYSmyweb>python manage.py makemigrations myapp #告诉django,myapp中的表结构有更新
    C:UsersWYSmyweb>python manage.py migrate myapp  #执行myapp中的表结构到mysql中

    数据库中的表名为myapp_book_info,myapp_site_info,但django代码中调用时的表名为models.py中定义的表名book_info,site_info

    5.数据表操作-增

    from myapp.models import book_info
    test1 = book_info(fromuser='testuser',fromsite='testsite',bookname='testbookname')
    test1.save()
    book_info.objects.create(fromuser='testuser',fromsite='testsite',bookname='testbookname')

    6.数据库操作-删

    test1 = book_info.objects.get(bookname='testbookname')
    test1.delete()
    book_info.objects.filter(bookname='testbookname').delete()
    book_info.objects.all().delete()

    7.数据库操作-改

    test1 = book_info.objects.get(bookname='testbookname')
    test1.bookname = 'book1'
    test1.fromuser = 'user1'
    test1.save
    book_info.objects.filter(bookname='testbookname').update(fromuser='user1')
    book_info.objects.all().update(fromuser='user1')

    8.数据库操作-查

    list = book_info.objects.all()
    for i in list:
        print(i.book_name)
    list = book_info.objects.filter(bookname='testbookname', fromuser='testuser')  #类似于SQL中的WHERE
    list = book_info.objects.filter( fromuser__contains='testuser')  #注意中间是双下划线,类似于SQL中的where fromuser like "%testuser%" 
    #此外还有icontains(大小写无关的like),startswith和endswith, 还有range(SQL BETWEEN查询)
    list = book_info.objects.get(bookname='testbookname')  #返回单条记录,不需要for直接list.bookname使用
    list = book_info.objects.filter().exclude().filter() #可无限嵌套
    book_info.object.all()[:5]  #前5条记录
    book_info.object.order_by(bookname)[2:5]  #排序后的第3、4、5条记录
    book_info.object.order_by(bookname)[0]  #排序后的第1条记录
    book_info.object.order_by(bookname)[0:1].get() #排序后的第1条记录
    book_info.object.all()[:10:2]  #从第1条记录到第11条记录步长为2的数据集
    复制代码
    __exact 精确等于 like ‘aaa’ 
    __iexact 精确等于 忽略大小写 ilike ‘aaa’ 
    __contains 包含 like ‘%aaa%’ 
    __icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。 
    __gt 大于 
    __gte 大于等于 
    __lt 小于 
    __lte 小于等于 
    __in 存在于一个list范围内 
    __startswith 以…开头 
    __istartswith 以…开头 忽略大小写 
    __endswith 以…结尾 
    __iendswith 以…结尾,忽略大小写 
    __range 在…范围内 
    __year 日期字段的年份 
    __month 日期字段的月份 
    __day 日期字段的日 
    __isnull=True/False 
    __isnull=True 与 __exact=None的区别
    复制代码
  • 相关阅读:
    Java异常的分类
    Java SE 6 新特性: Java DB 和 JDBC 4.0
    Java SE 6 新特性: 对脚本语言的支持
    面向对象开发方法优点
    RocketMQ之八:水平扩展及负载均衡详解
    Bluetooth 4.0之Android 解说
    iOS截取视频缩略图的两种方法
    Java NIO Buffer
    spark 启动job的流程分析
    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
  • 原文地址:https://www.cnblogs.com/shangjunnihao/p/9791372.html
Copyright © 2020-2023  润新知