[dj]django常用设置

关于django版本说明:

Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6(长期支持版本 LTS) 最后一个支持 Python 2.7 的版本

Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (注意,不再支持 Python 2)

1.创建项目
2.创建app
3.初始化settings
4.配置urls
5.配置templates<appname
6.返回字符串
7,返回index.html
8,创建模型
9,将模型里数据返回index.html

初始化第一个app

项目名: mysite
app名 : learn

- 新建project
django-admin startproject mysite

mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py


- 新建app
python manage.py startapp learn 


- 注册app(settings.py)
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
 
    'learn',
)


- 设置国际化

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

USE_TZ = False              #数据库入库时间,使用本地时间,而非UTC时间
- 添加view
mysite/learn/views.py

from django.http import HttpResponse
def index(request):
    return HttpResponse("hello maotai!")

- 修改url
mysite/urls.py

from learn import views
urlpatterns = [
    url(r'^$',views.index),
    url(r'^admin/', admin.site.urls),
]
  • 访问展示

urls include设置

- 项目mysite的目录
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    learn/
        urls.py
        ...

- 项目url设置   
mysite/urls.py

# 别忘记在顶部引入 include 函数
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^learn/', include('learn.urls')),
]

注意:
url(r'^/learn/', include('learn.urls')), #注: learn钱不能加/,否则报错


- app url设置
learn/urls.py

from django.conf.urls import url
from learn import views

app_name = 'learn'                #这里方便html里调用url
urlpatterns = [
    url(r'^add/', views.add, name='add'),
    url(r'^add/(d+)(d+)', views.add2, name='add2'),
]

视图配置例子

def add(request):
    return render(request, "add2.html")

def add2(request, a, b):
    c = int(a) + int(b)
    return HttpResponse(str(c))

新增templates模板文件路径设置

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    templates/
            learn/
                add2.html
mysite/settings.py

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]

静态文件路径配置

根目录下static文件夹下

STATIC_URL = '/static/'  #前端页面写这个路径即可.
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'),
]

STATIC_URL被映射到STATICFILES_DIRS指定的目录.

STATIC_URL = '/statics/' 
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'),
]

前端写的时候写
<link rel="stylesheet" type="text/css" href="/statics/css/style.css">

TemplateView函数可以将html直接渲染到前端

url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"),

模板url渲染

add2.html
...
<a href='{% url "learn:add2" 4 5 %}'>4+5</a>

会被渲染成:
<a href='/users/4/5/'>4+5</a>

reverse函数解析url name

from django.urls import reverse


def get(self, request):
    logout(request)
    return HttpResponseRedirect(reverse("index"))

使用自定义的user表

AUTH_USER_MODEL = "users.UserProfile"

替换authenticate方法实现邮箱and用户名同时可登录

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)
from django.db.models import Q
from django.contrib.auth.backends import ModelBackend

class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

url直接返回view

from django.views.generic import TemplateView

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"),                 # 通过url直接返回html
    url(r'^login/', views.LoginView.as_view(), name="login"),                                   # 通过后端来渲染的view
    url(r'^active/(?P<active_code>.*)/$',views.ActiveUserView.as_view(),name="user_active"),
]

表单渲染

from django import forms
from captcha.fields import CaptchaField


class LoginForm(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(required=True, min_length=5)


class RegisterForm(forms.Form):
    email = forms.EmailField(required=True)
    password = forms.CharField(required=True, min_length=5)
    captcha = CaptchaField(error_messages={"invalid": "验证码错误"})
class RegisterView(View):
    def get(self, request):
        register_form = RegisterForm() # 这里
        ...

    def post(self, request):
        register_form = RegisterForm(request.POST) #这里
        ...
            return render(request, 'register.html', {"register_form": register_form, "msg": ""})

前端:
- 1.name和后端forms一致
<p>邮箱: <input type="text" name="email">{{ register_form.errors.email }}</p>

- 2.后端forms直接实例化后,调用某个字段在前端显示
<p>{{ register_form.captcha }}{{ register_form.errors.captcha }}</p>

后端基于class来写

省去了if request.method == "POST"等重复性代码

from django.views.generic.base import View
from django.contrib.auth import authenticate, login, logout

class LoginView(View):
    def get(self, request):
        return render(request, "login.html")

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
            user = authenticate(username=user_name, password=pass_word)
            print(user)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return render(request, "index.html")
                else:
                    return render(request, "login.html", {"msg": "用户未激活"})
            else:
                return render(request, "login.html", {"msg": "用户不存在"})
        else:
            return render(request, "login.html", {"msg": "用户不存在", "login_form": login_form})

邮箱配置

EMAIL_HOST = "smtp.sina.com"
EMAIL_PORT = 25
EMAIL_HOST_USER = "lanny@sina.com"
EMAIL_HOST_PASSWORD = "123456"
EMAIL_USE_TLS = False
EMAIL_FROM = "lanny@sina.com"

logout退出view

class LogoutView(View):
    def get(self, request):
        logout(request)
        return HttpResponseRedirect(reverse("index"))

图形验证码:

pip install  django-simple-captcha

参考: http://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation

django国际化

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

USE_TZ = False              #数据库入库时间,使用本地时间,而非UTC时间

py3 mysql-python驱动安装

- 安装
pip install pymysql

- 在站点的__init__.py文件中添加
import pymysql
pymysql.install_as_MySQLdb()

- 修改settings
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        "HOST": '127.0.0.1',
        'PORT': 3306,
        'USER':'root',
        'PASSWORD': '',
        'NAME': 'bbs',
    }
}

makemigrations
migrate

- 然后navicat看看表存在没.

导入django项目

使用settings里的变量

from django.conf import settings

django mysql配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': APP_CODE,
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
        'CONN_MAX_AGE': 60,
    },
}

media_root设置

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
from django.views.static import serve


# 课程机构
path('org_list/', org_views.OrgView.as_view(), name="org_list"),
## 配置上传文件的访问处理函数  这里使用django内置的serve来返回MEDIA_ROOT
url(r'^media/(?P<path>.*)', serve, {'document_root':MEDIA_ROOT}),
原文地址:https://www.cnblogs.com/iiiiiher/p/8204099.html