1 Star 1 Fork 0

Ttcnjack / django-test

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

开发进程

​ 学习forms.ModelForm

  1. 本地配置

    1. settings
    2. local-settings.py 中设置部分设置文件
      可以在setting中增加
      try:
      	from .local_settings import *
      except ImportError:
      	pass
    3. 创建本地配置
      LANGUAGE_CODE = 'zh-hans'
      DATABASES = {
      	'default':{
      			"ENGINE": 'django.db.backends.sqlite3',
      			"NAME": ''
      	}
      }
  2. 使用CDN制作前端

    1. 通过django的ModelForms来通过模型来展示到页面上
  3. Redis跟Mysql数据库设置

    1. redis

      CACHES = {
          "default": {
              "BACKED": "django_redis.cache.RedisCache",
              "LOCATION": "redis://127.0.0.1:6379",
              "OPTIONS": {
                  "CLIENT_CLASS": "django_redis.client.DefaultClient",
                  "CONNECTION_POOL_KWARGS": {
                      "max_connections": 1000,
                      "encoding": "utf-8"
                  },
              }
          }
      }
    2. views中的使用

      from django_redis import get_redis_connection
      
      def get_data(request):
      	conn = get_redis_connection('default')
      	
      	conn.set('key', 'value', ex=19)
    3. 前端的html的使用

      // 获取当前form表单中所有的input选项的输入内容	
      $('#id').serialize()
  4. 使用中间件来对request登录之后session进行处理

    1. request.tracer
  5. model

    1. 创表的字段解释
      1. ForeignKey(related_name = 'a')
        1. 反向查询时, 可以通过related_name来区分同个表内的多个关联关系
      2. ManyToManyField(to='UserInfo', through='关联表', through_field=('字段名'))
        1. 多对多表可以通过此表来创建查询
        2. 如果有需要创建新的多对多表,也可以用这个字段来增加关联表里新的字段
        3. 可以节省查询, 但是无法增删该查,(需要单独的关联表)
  6. Form

    1. 通过form更改表单的显示,包括id等数据

    2. 可以通过fields等确定输入的列表

    3. 部分样式应用BootStrap, 定制ModelForm插件

      class BootStrapForm(object):
      
          bootstrap_class_exclude = []
      
          def __init__(self, *args, **kwargs):
              """重写init方法,让每个字段都加上同样的属性, 增加显示样例"""
              super().__init__(*args, **kwargs)
              for name, fields in self.fields.items():
                  # fields: 字段对象
                  if name in self.bootstrap_class_exclude:
                      continue
                  fields.widget.attrs['class'] = 'form-control'   # 给每个字段增加class属性
                  fields.widget.attrs['placeholder'] = '请输入{}'.format(fields.label, )
      
      
      class ProjectModelsForm(BootStrapForm, forms.ModelForm):
      
          bootstrap_class_exclude = ['color']
      
          class Meta:
              model = models.Project
              fields = ['name', 'color', 'desc']
              widgets = {
                  'desc': forms.Textarea,
                  'color': ColorRadioSelect(attrs={'class': 'color-radio'}),
              }
      
          def __init__(self, request, *args, **kwargs):
              super().__init__(*args, **kwargs)
              self.request = request
      from django.forms import RadioSelect
      
      
      class ColorRadioSelect(RadioSelect):
      
          template_name = 'widgets/color_radio/radio.html'		#自定义的文件,可以更改部分的标签
          option_template_name = 'widgets/color_radio/radio_option.html'
    4. 在form=ModelForm(instance=new_object) 更新对应的数据库,而不是创建

  7. URL

    1. inclusion_tag 的项目切换
    2. process_view 中间件的各种问题
    3. 路由分发

markdown编辑器的使用

  1. 下载markdown的插件

    https://gitee.com/pandao/editor.md/repository/archive/master.zip

    下载之后放在静态文件中并加载后导入css和js

  2. js中引入对应的id

    $(function () {
                initCatalog();
                initEditorMd();
            });
    
            /* 初始化markdown编辑器*/
            function initEditorMd() {
                editormd('editor', {
                    placeholder: '请输入内容',
                    height: 500,
                    path: "{% static 'plugin/editor-md/lib/' %}",  //指定静态lib中依赖文件
                })
            }
  3. 全屏问题

    需要设置对应div全屏状态下最上端显示

    .editor-fullscreen{					// 可以通过-fullscreen定义全屏状态
                z-index: 1001;
            }
  4. markdown预览模式

    <link rel="stylesheet" href="{% static 'plugin/editor-md/css/editormd.preview.min.css' %}">
        
    
    <div id="previewMarkdown">
                                    <textarea>
                                    {{ wiki_object.content }}
                                    </textarea>
    </div>
    
    <script src="{% static 'plugin/editor-md/editormd.min.js' %}"></script>
        <script src="{% static 'plugin/editor-md/lib/marked.min.js' %}"></script>
        <script src="{% static 'plugin/editor-md/lib/prettify.min.js' %}"></script>
        <script src="{% static 'plugin/editor-md/lib/raphael.min.js' %}"></script>
        <script src="{% static 'plugin/editor-md/lib/sequence-diagram.min.js' %}"></script>
        <script src="{% static 'plugin/editor-md/lib/flowchart.min.js' %}"></script>
        <script src="{% static 'plugin/editor-md/lib/jquery.flowchart.min.js' %}"></script>
        
        function initPreviewMarkdown() {
                editormd.markdownToHTML("previewMarkdown", {
                    htmlDecode: "style,script,iframe",      // 屏蔽前端输入html代码
                })
            }
    1. 编辑模式绑定
  5. LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'
    
    SMS_SDK = 1400399389
    SMS_APP_KEY = "e9f4f9390bb03387c58ca5a7bc82bdc7"
    SMS_SIGNAL = "开发之路tcc"
    SMS_TEL = '13420129486'     # 电话
    SMS_SIGN = 298799           # sms的签名id
    SMS_ID = 661589             # sms的模板id
    
    CACHES = {                  # redis的配置
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {
                    "max_connections": 1000,
                    "encoding": "utf-8"
                },
            }
        }
    }
    
    COS_ID = "AKIDdhqjU3bvFI6vUoqCwQSFl0A6JK6e3frs"
    
    COS_KEY = "LYYDhsnt2vLVNyvc3i8RSDk6Bze8ON5f"
  6. 前端使用临时凭证去上传数据

    1. 创建桶

      创建桶时需要注意跨域的问题

      def create_bucker(bucket, region='ap-chengdu'):
          """
          创建桶
          :param bucket:
          :param region:
          :return:
          """
          # region = 'ap-shenzhen-fsi'
      
          config = CosConfig(Region=region, SecretId=settings.COS_ID, SecretKey=settings.COS_KEY)
          client = CosS3Client(config)
          client.create_bucket(
              Bucket=bucket,
              ACL='public-read'
          )
          # 解决上传文件跨域问题
          """
           cors_config = {
                      'CORSRule': [
                          {
                              'ID': '1234',
                              'AllowedOrigin': ['http://www.qq.com'],
                              'AllowedMethod': ['GET', 'PUT'],
                              'AllowedHeader': ['x-cos-meta-test'],
                              'ExposeHeader': ['x-cos-meta-test1'],
                              'MaxAgeSeconds': 500
                          }
                      ]
                  }
                  response = client.put_bucket_cors(
                      Bucket='bucket',
                      CORSConfiguration=cors_config
                  )"""
      
          cors_config = {
              'CORSRule': [
                  {
                      'AllowedOrigin': '*',
                      'AllowedMethod': ['GET', 'PUT', 'HEAD', 'POST', 'DELETE'],
                      'AllowedHeader': '*',
                      'ExposeHeader': '*',
                      'MaxAgeSeconds': 500
                  }
              ]
          }
          client.put_bucket_cors(
              Bucket=bucket,
              CORSConfiguration=cors_config
          )
    2. 使用sts创建临时凭证

      def credential(bucket, region):
          """获取临时凭证"""
          from sts.sts import Sts
          config = {
              # 临时凭证的有效时长,单位:秒
              'duration_seconds': 180,
              # 固定密钥_id
              'secret_id': settings.COS_ID,
              'secret_key': settings.COS_KEY,
              # bucket
              'bucket': bucket,
              # region
              'region': region,
              # 根据用户登录的路径判断上传的类型, *为所有类型
              'allow_prefix': '*',
              # 设置密钥能使用的权限
              'allow_actions': [
                  # // 简单上传操作
                  # "name/cos:PutObject",
                  # // 表单上传对象
                  # "name/cos:PostObject",
                  # // 分块上传:初始化分块操作
                  # "name/cos:InitiateMultipartUpload",
                  # // 分块上传:List
                  # 进行中的分块上传
                  # "name/cos:ListMultipartUploads",
                  # // 分块上传:List
                  # 已上传分块操作
                  # "name/cos:ListParts",
                  # // 分块上传:上传分块块操作
                  # "name/cos:UploadPart",
                  # // 分块上传:完成所有分块上传操作
                  # "name/cos:CompleteMultipartUpload",
                  # // 取消分块上传操作
                  # "name/cos:AbortMultipartUpload"
                  '*',
              ],
          }
          sts = Sts(config)
          result_dict = sts.get_credential()
          return result_dict
          
          # 之后返回对应的dict
    3. 前端创建对应cos

      var COS_OBJECT = new COS({
                  // 必选参数
                  getAuthorization: function (options, callback) {
                      // 访问后端获取临时凭证
                     $.get(COS_REDENTIAL, {
                          // 可从 options 取需要的参数
                      }, function (data) {
                          var credentials = data && data.credentials;
                          if (!data || !credentials) return console.error('credentials invalid');
                          callback({
                              TmpSecretId: credentials.tmpSecretId,
                              TmpSecretKey: credentials.tmpSecretKey,
                              XCosSecurityToken: credentials.sessionToken,
                              // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
                              StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
                              ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
                          });
                      });
                  }
              });
              
              
       function bindUploadFile() {
                  // 获取临时凭证, 根据凭证上传
                  $('#uploadFile').change(function () {
                      var fileList = $(this)[0].files;    // 获取文件上传
                      $.each(fileList, function (index, fileObject) {
                          // 循环遍历每个文件,并上传
                          var fileName = fileObject.name;
                          console.log(fileName)
                          // 异步上传文
      
                          COS_OBJECT.putObject({
                              Bucket: "{{ request.tracer.project.bucket }}",
                              Region: "{{ request.tracer.project.region }}",
                              Key: fileName,
                              Body: fileObject, // 上传文件对象
                              onProgress: function (progressData) {
                                  console.log('文件上传进度--->', fileName, JSON.stringify(progressData));
                              }
                          }, function (err, data) {
                              console.log(err || data);
                          })
      
                      })
                  })
              }
    4. var fileName = fileObject.name;
                          console.log(fileName)
                          // 异步上传文
      
                          COS_OBJECT.putObject({
                              Bucket: "{{ request.tracer.project.bucket }}",
                              Region: "{{ request.tracer.project.region }}",
                              Key: fileName,
                              Body: fileObject, // 上传文件对象
                              onProgress: function (progressData) {
                                  console.log('文件上传进度--->', fileName, JSON.stringify(progressData));
                              }
                          }, function (err, data) {
                              console.log(err || data);
                          })
                          
                          
      var COS_OBJECT = new COS({
                  // 必选参数
                  getAuthorization: function (options, callback) {
                      // 访问后端获取临时凭证
                      $.get(COS_REDENTIAL, {
                          // 可从 options 取需要的参数
                      }, function (data) {
                          var credentials = data && data.credentials;
                          if (!data || !credentials) return console.error('credentials invalid');
                          callback({
                              TmpSecretId: credentials.tmpSecretId,
                              TmpSecretKey: credentials.tmpSecretKey,
                              XCosSecurityToken: credentials.sessionToken,
                              // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
                              StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
                              ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
                          });
                      });
                  }
              });

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/ttcnjack/django-test.git
git@gitee.com:ttcnjack/django-test.git
ttcnjack
django-test
django-test
master

搜索帮助