虚拟环境
# 虚拟环境安装(linux)
pip3 install pipenv
# 设置环境变量(否则为默认目录)
WORKON_HOME D:\python_pipenv\envs
# 虚拟环境创建
virtualenv [env_name]
# 创建虚拟环境时指定python解释器
virtualenv -p C:\Python36\python.exe [virutalenv_name]
# 进入虚拟环境目录
cd python_pipenv\envs\[virutalenv_name]
# 进入虚拟环境
pipenv shell
# 退出虚拟环境
exit
#删除虚拟环境
pipenv --rm
项目建立
#Django 项目建立
django-admin startproject [项目名称]
#项目结构
manage.py
settings.py
urls.py
wsgi.py
# 建立APP
python manage.py startapp [app名称]
# app结构
__init__.py
models.py
views.py
tests.py
admin.py
# DEBUG模式
DEBUG = Ture
Settings 设置
#1、确保django.contrib.staticfiles已经添加到settings.INSTALLED_APPS中
#2、在settings.py中设置了STATIC_URL
#3、在已经安装了的app下创建一个文件夹叫做static,然后再在这个static文件夹下创建一个当前app的名字的文件夹,再把静态文件放到这个文件夹下
# 1、静态资源文件
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
{% load static %}
<link rel="stylesheet" href="{% static 'style.css' %}">
'builtins':['django.templatetags.static'] #settings.INSTALLED_APPS中 不用每个文件都load static
# 2、设置文件上传地址
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'
# 3、语言设置
LANGUAGE_CODE = 'zh-Hans'
# 4、时间设置
TIME_ZONE = 'Asia/Shanghai'
# 5、TEMPLATES 路径设置
'DIRS': [os.path.join(BASE_DIR,'templates')],
# 6、数据库的连接
DATABASES = {
'default': {
# 数据库引擎(是mysql还是oracle等)
'ENGINE': 'django.db.backends.mysql',
# 数据库的名字
'NAME': 'logic',
# 连接mysql数据库的用户名
'USER': 'root',
# 连接mysql数据库的密码
'PASSWORD': 'root',
# mysql数据库的主机地址
'HOST': '127.0.0.1',
# mysql数据库的端口号
'PORT': '3306',
}
user表覆盖
# user.model 中
from django.db import models
from django.contrib.auth.models import AbstractUser
GENDER_CHOICES = (
('male','男'),
('female','女')
)
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=20,null=True,verbose_name='昵称')
birthday = models.DateField(verbose_name='生日',null=True)
gender = models.CharField(verbose_name='性别',choices=GENDER_CHOICES,max_length=2)
address = models.CharField(max_length=100,verbose_name='地址',null=True)
mobile = models.CharField(max_length=11,unique=True,verbose_name='手机号码')
image = models.ImageField(upload_to='head_image/%Y/%m/%d')
# 后台管理系统中显示中文
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
def __str__(self):
if self.nick_name:
return self.nick_name
else:
return self.username
# setting 文件中添加(用于重载users表)
AUTH_USER_MODEL = 'users.UserProfile'
# 映射数据表
python manage.py makemigrations users
python manage.py migrate users
创建超级用户
python manage.py createsuperuser
admin 注册
# apps.users.admin
from django.contrib import admin
from apps.users.models import UserProfile
class UserProfileAdmin(admin.ModelAdmin): # 建立一个UserProfileAdmin类,继承自admin.ModelAdmin
pass
admin.site.register(UserProfile,UserProfileAdmin) # 将 UserProfile 注册到 UserProfileAdmin
xadmin 导入注册
# 下载依赖库
# app 注册
'crispy_forms',
'xadmin',
# urls.py
urlpatterns = [
path('xadmin/',xadmin.site.urls),
]
python manage.py makemigrations xadmin
python manage.py migrate xadmin
# 将models注册到 xadmin 中(apps.users.xadmin.py)
import xadmin
from apps.courses.models import Course
class CourseAdmin(object):
pass
xadmin.site.register(Course,CourseAdmin)
# xadmin界面设置列表、搜索、过滤、等信息
class CityAdmin(object):
# 列表页面显示的字段
list_display = ['id','name','desc']
# 搜索的字段
search_fields = ['name','desc']
# 过滤字段
list_filter = ['name','desc']
# 修改字段
list_editable = ['name','desc']
xadmin.site.register(City,CityAdmin)
xadim 中app 名称显示中文
# users.__init__
default_app_config = 'apps.users.apps.UsersConfig'
# users.apps
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'apps.users'
verbose_name = '用户信息'
视图模式
# 路由映射(两部分组成,主函数中一个、APP中自建一个)
# url的模块化
urlpatterns = [
path('',include("apps.user.urls"))
]
# apps.user.urls
from news import views
urlpatterns =[
path("",views.index,name = "index") # 路由映射关系
]
# 写在 app 中的views.py中
# 视图第一个参数 为request(HttpRequest)对象
# 如下:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return render(request,'index.html')
#**django 内置的验证用户是否存在的方法 authenticate**
# **内置的登陆方法 login**
from django.contrib.auth import authenticate,login
# 对form表单提交上来的数据进行提取
username = request.POST.get("username")
password = request.POST.get("password")
# authenticate方法
user = authenticate(username = username,password = password)
if user is not None:
# 内置登陆方法login (省去了cookie、session操作)
login(request,user)
return redicet(reverse('front':'index')) # 页面重定向
else:
return render(request,'login.html',{'msg':'用户名或密码错误'})
# forms 表单验证
# apps.user.forms(modelform 全校验、forms.Form部分验证)
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(required = Ture,min_length = 2)
password = forms.charField(request = Ture,min_length = 3)
# apps.users.views.py (验证过程)
form apps.users.forms import LoginForm
class LoginView(View):
def post(self,request):
forms = LoginForms(request.POST) # 表单验证
if forms.is_valid():
username = request.POST.get('username')
passward = request.POST.get('password')
user = authenticate(username = username,passward = passward)
if user is not None:
login(request,user)
return redirect(reverse('front:index'))
else:
return render(request,'login.html',{'msg':'用户名或密码错误'})
else:
print(forms.error.get_json_data())
return render(request,'login.html',{'forms.error': forms.errors,'forms':forms})
# 退出方法
class LogoutView(View):
def get(self,request):
logout(request)
return redirict(reverse('front:index'))