python3-开发进阶-仿博客园项目setting.py的文件的配置,admin,forms(2)
?前面我們先分析了一下,做這個項目需要的幾張表,今天我們從配置文件開始一步一步去解釋這么的原因
首先先來看setting.py文件:
""" Django settings for mybbs project.Generated by 'django-admin startproject' using Django 1.11.11.For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """import os# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'b)f=d-08hdi_w_z1^=5e9oom9#+h1a*jk-y#u!-vt$rj%5y&aj'# SECURITY WARNING: don't run with debug turned on in production! DEBUG = TrueALLOWED_HOSTS = []# Application definition INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','myapp.apps.MyappConfig','debug_toolbar' #https://www.cnblogs.com/ManyQian/p/9277861.html 具體詳情參考這里 ]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','debug_toolbar.middleware.DebugToolbarMiddleware', 'django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware', ]ROOT_URLCONF = 'mybbs.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},}, ]WSGI_APPLICATION = 'mybbs.wsgi.application'# Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases# DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } DATABASES={'default':{'ENGINE':'django.db.backends.mysql', #數(shù)據(jù)庫的配置'NAME':'duoduo','USER':'root','PASSWORD':'123','HOST':'127.0.0.1','PORT':3306,} }# Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',}, ]# Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = False #本機的時間,不用考慮時區(qū)的問題# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/'STATICFILES_DIRS=[os.path.join(BASE_DIR,'static') ]# 指定一下認證使用 自定義的UserInfo表 AUTH_USER_MODEL='myapp.UserInfo'#用戶上傳的文件配置項 MEDIA_URL='/media/' MEDIA_ROOT=os.path.join(BASE_DIR,'media')# 日志配置 Google瀏覽器jQuery 的URL在國內(nèi)不支持 DEBUG_TOOLBAR_CONFIG ={'JQUERY_URL':'//cdn.bootcss.com/jquery/2.2.4/jquery.min.js', } #設(shè)置為空,就用項目中的jQuery BASE_LOG_DIR = os.path.join(BASE_DIR, "log")LOGGING = {'version': 1,# 禁用已經(jīng)存在的logger實例'disable_existing_loggers': False,# 定義日志 格式化的 工具'formatters': {'standard': {'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]''[%(levelname)s][%(message)s]'},'simple': {'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'},'collect': {'format': '%(message)s'}},# 過濾'filters': {'require_debug_true': {'()': 'django.utils.log.RequireDebugTrue',},},# 日志處理器'handlers': {'console': {'level': 'DEBUG','filters': ['require_debug_true'], # 只有在Django debug為True時才在屏幕打印日志'class': 'logging.StreamHandler','formatter': 'simple'},'default': {'level': 'INFO','class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切'filename': os.path.join(BASE_LOG_DIR, "info.log"), # 日志文件'maxBytes': 1024 * 1024 * 50, # 日志大小 50M'backupCount': 3,'formatter': 'standard','encoding': 'utf-8',},'error': {'level': 'ERROR','class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切'filename': os.path.join(BASE_LOG_DIR, "err.log"), # 日志文件'maxBytes': 1024 * 1024 * 50, # 日志大小 50M'backupCount': 5,'formatter': 'standard','encoding': 'utf-8',},'collect': {'level': 'INFO','class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),'maxBytes': 1024 * 1024 * 50, # 日志大小 50M'backupCount': 5,'formatter': 'collect','encoding': "utf-8"}},# logger實例'loggers': {# 默認的logger應(yīng)用如下配置'': {'handlers': ['default', 'console', 'error'], # 上線之后可以把'console'移除'level': 'DEBUG','propagate': True,},# 名為 'collect'的logger還單獨處理'collect': {'handlers': ['console', 'collect'],'level': 'INFO',}}, }INTERNAL_IPS = ['127.0.0.1', ]就是驗證登陸和注冊forms表單數(shù)據(jù)的合法性
from django import forms from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from myapp import models#登陸的用戶名 class LoginForm(forms.Form):username=forms.CharField(label='用戶名',min_length=3,max_length=12,error_messages={'required':'用戶名不能為空','min_length':'用戶名最短3位','max_length':'用戶名最長12位',},widget=forms.widgets.TextInput(attrs={'class':'form-control '}))password=forms.CharField(label='密碼',min_length=4,max_length=12,error_messages={'required':'密碼不能為空','min_length':'密碼最短3位','max_length':'密碼最長12位',},widget=forms.widgets.PasswordInput(attrs={'class':'form-control'}))#注冊的form class RegForm(forms.Form):username=forms.CharField(label='用戶名',min_length=3,max_length=12,error_messages={'required':'用戶名不能為空!','min_length':'用戶名最短3位','max_length':'用戶名最長12位',},widget=forms.widgets.TextInput(attrs={'class':'form-control'}),)password=forms.CharField(label='密碼',min_length=4,max_length=12,error_messages={'required':'密碼不能為空!','min_length':'密碼最短4位','max_length':'密碼最長12位',},widget=forms.widgets.PasswordInput(attrs={'class':'form-control'}))re_password = forms.CharField(label="確認密碼",min_length=4,max_length=12,error_messages={"required": "確認密碼不能為空!","min_length": "密碼最短4位","max_length": "密碼最長12位"},widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}))phone = forms.CharField(label="手機",min_length=11,max_length=11,validators=[RegexValidator(r'^\d{11}$', "手機號必須是數(shù)字"),RegexValidator(r'^1[356789][0-9]{9}$', "手機號碼格式不正確")],error_messages={"required": "手機不能為空!","min_length": "手機號碼11位","max_length": "手機號碼11位"},widget=forms.widgets.TextInput(attrs={"class": "form-control"}))# 局部鉤子def clean_username(self):value = self.cleaned_data.get("username", "")if "xxx" in value:raise ValidationError("不符合社會主義核心價值觀!")elif models.UserInfo.objects.filter(username=value):raise ValidationError("用戶名已存在!")else:return value# 全局鉤子def clean(self):pwd = self.cleaned_data.get("password", "")re_pwd = self.cleaned_data.get("re_password", "")if re_pwd and pwd == re_pwd:return self.cleaned_dataelse:err_msg = "兩次輸入的密碼不一致"self.add_error("re_password", err_msg)raise ValidationError(err_msg)把表格注冊到admin中
from django.contrib import admin from myapp import models# Register your models here. admin.site.register(models.Article) admin.site.register(models.UserInfo) admin.site.register(models.ArticleDetail) admin.site.register(models.Blog) admin.site.register(models.Category) admin.site.register(models.Tag) admin.site.register(models.Comment) admin.site.register(models.ArticleUpDown) admin.site.register(models.Article2Tag)?文件的結(jié)構(gòu):
我們先從注冊功能開始說起:
1.html
form_obj.字段? ? ------》生產(chǎn)html代碼
2.views.py
form_obj=forms.RegForm(request.POST)
form_obj.is_valid() ------->返回布爾值
1.如果返回Trun,就能拿到校驗后的數(shù)據(jù)
form_obj.cleaned_data
3.看源碼分析得到鉤子函數(shù)
1.局部鉤子
def clean_字段名():
1.return value
2.raise ValidationError('錯誤信息')
2.全局鉤子
def clean():
1.return self.cleaned_data
2.raise ValidationError('錯誤信息')
1、注冊的form類
2、上傳文件?
1.表單上傳
form標(biāo)簽兩個屬性
1.method='post'
2.enctype='multipart/form-data'
2.AJAX上傳
1.創(chuàng)建一個FormData對象,使用對象的append()方法填充數(shù)據(jù)
2.AJAX需要設(shè)置兩個參數(shù)
1.processData:false
2.contentTyoe:false
3.Django關(guān)于上傳文件的幾個配置
1.上傳文件存在哪兒?
1.settings.py中?配置MEDIA_ROOT=os.path.join(BASE_DIR,'media')
2.我用戶怎么訪問我上傳的文件
1.settings.py中配置 MEDIA_URL='/media/
2.在urls.py中?配置 media開頭的訪問請求交給誰來處理'
url(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT})
4.瀏覽器圖片預(yù)覽
1.FileReader對象
from django.shortcuts import render, HttpResponse, redirect from myapp import forms, models from django.contrib import auth from django.http import JsonResponse import logging# 生成一個以當(dāng)前文件名命名的logger實例 logger = logging.getLogger(__name__) # 生成一個名為collect的logger實例 collect_logger = logging.getLogger("collect")def reg(request):logger.info("又來了,小伙子!")collect_logger.info("多多來洗腳!")if request.method == "POST":ret = {"code": 0}form_obj = forms.RegForm(request.POST)logger.debug(request.FILES)if form_obj.is_valid():# 數(shù)據(jù)經(jīng)過校驗,沒問題 logger.debug(form_obj.cleaned_data)avatar_obj = request.FILES.get("avatar")# 創(chuàng)建用戶form_obj.cleaned_data.pop("re_password", "")models.UserInfo.objects.create_user(avatar=avatar_obj,**form_obj.cleaned_data #這個騷操作大家還記得?)ret["data"] = "/login/"else:# 數(shù)據(jù)沒有經(jīng)過校驗,有問題ret["code"] = 1ret["data"] = form_obj.errorsreturn JsonResponse(ret)form_obj = forms.RegForm()return render(request, "reg.html", {"form_obj": form_obj})reg.html文件的代碼
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>歡迎注冊</title><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"><style>.reg-form {margin-top: 70px;}#show-avatar {width: 80px;height: 80px;}</style> </head> <body><div class="container"><div class="row"><div class="col-md-6 col-md-offset-3 reg-form"><form class="form-horizontal" autocomplete="off" novalidate><div class="form-group"><label for="{{ form_obj.username.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.username.label }}</label><div class="col-sm-10">{{ form_obj.username }}<span class="help-block"></span></div></div><div class="form-group"><label for="{{ form_obj.password.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.password.label }}</label><div class="col-sm-10">{{ form_obj.password }}<span class="help-block"></span></div></div><div class="form-group"><label for="{{ form_obj.re_password.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.re_password.label }}</label><div class="col-sm-10">{{ form_obj.re_password }}<span class="help-block"></span></div></div><div class="form-group"><label for="{{ form_obj.phone.id_for_label }}"class="col-sm-2 control-label">{{ form_obj.phone.label }}</label><div class="col-sm-10">{{ form_obj.phone }}<span class="help-block"></span></div></div><div class="form-group"><label class="col-sm-2 control-label">頭像</label><div class="col-sm-10"><input accept="image/*" type="file" id="id_avatar" name="avatar" style="display: none"><label for="id_avatar"><img src="/static/img/default.png" id="show-avatar"></label> </div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="button" class="btn btn-default" id="reg-button">注冊</button></div></div></form></div></div> </div><script src="/static/jquery-3.3.1.min.js"></script> <script src="/static/setupAjax.js"></script><script>// 找到注冊按鈕綁定點擊事件 $("#reg-button").click(function () {var dataObj = new FormData();dataObj.append("username", $("#id_username").val());dataObj.append("password", $("#id_password").val());dataObj.append("re_password", $("#id_re_password").val());dataObj.append("phone", $("#id_phone").val());dataObj.append("avatar", $("#id_avatar")[0].files[0]);$.ajax({url: "/reg/",type: "POST",processData: false,contentType: false,data: dataObj,success: function (data) {console.log(data);if (data.code) {// 如果有報錯信息,應(yīng)該在頁面的對應(yīng)位置展示出來var errMsgObj = data.data;$.each(errMsgObj, function (k, v) {// k: 字段名 v:報錯信息的數(shù)組// 根據(jù)字段名找對應(yīng)的input標(biāo)簽,把錯誤信息添加到對應(yīng)位置 $("#id_" + k).next(".help-block").text(v[0]).parent().parent().addClass("has-error");})} else {console.log(data.data);location.href = data.data || "/login/"}}})});// 給每一個input標(biāo)簽綁定focus事件,移除當(dāng)前的錯誤提示信息 $("input.form-control").focus(function () {$(this).next(".help-block").text("").parent().parent().removeClass("has-error");});// 頭像預(yù)覽 $("#id_avatar").change(function () {// 找到你選中的那個頭像文件var fileObj = this.files[0];console.log(fileObj);// 讀取文件路徑var fileReader = new FileReader();fileReader.readAsDataURL(fileObj);// 等圖片被讀取完畢之后,再做后續(xù)操作 fileReader.onload = function () {// 設(shè)置預(yù)覽圖片 $("#show-avatar").attr("src", fileReader.result);};})</script> </body> </html>注冊的效果圖:
?
轉(zhuǎn)載于:https://www.cnblogs.com/ManyQian/p/9276697.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python3-开发进阶-仿博客园项目setting.py的文件的配置,admin,forms(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spring框架】 ☞ 项目启动时执行
- 下一篇: [NOI 2017]整数