蓝鲸Django: 访问数据库
来自CloudWiki
目录
数据库数据传入前台
修改views.py文件
moments.view.py:
from django.shortcuts import render from django.http import HttpResponse # Create your views here.i from .models import WeChatUser,Status 。。。 def show_status(request): statuses = Status.objects.all() #import pdb #pdb.set_trace() print(statuses.query) return render(request,"status.html",{"statuses": statuses}) 。。。
浏览器访问http://10.0.0.30:8000/status
会在后台看到这里print(status.query) 的打印结果,实际上是一个select语句:
SELECT "moments_status"."id", "moments_status"."user_id", "moments_status"."text", "moments_status"."pics", "moments_status"."pub_time" FROM "moments_status" ORDER BY "moments_status"."id" ASC
修改html模板
status.html:
过滤时间:
<p style="float:left; color:gray; font-size:30px">{{ status.pub_time|date:"m-d-Y H:i" }}</p>
修改时区:
wechat/settings.py:
TIME_ZONE = 'Asia/Shanghai'
效果
前台数据传入数据库
修改urls.py文件
wechat/urls.py
"""wechat URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from moments.views import home from moments.views import show_user,show_status,submit_post from django.contrib.auth.views import LoginView,LogoutView urlpatterns = [ path('admin/', admin.site.urls), path('',LoginView.as_view(template_name="homepage.html")), path('', home), path('user',show_user), path('status',show_status), path('post',submit_post), path('exit',LogoutView.as_view(next_page="/")) ]
修改'退出'链接
templates/base.html:
<li><a href="#">About</a></li> <li><a href="/exit">Exit</a></li>
修改settings.py
wechat/settings.py:
添加两行:(指定网站登陆页面 和登陆后跳转页面)
LOGIN_URL='/' LOGIN_REDIRECT_URL='/status'
修改表单(homepage.html)
在该页中找到表单并做如下修改:
<form style="background-color:white; margin-top:25vh; padding:2vh" method="post" action=""> {% csrf_token %} <div class="form-group"> <input type="text" class="form-control" id="exampleInputEmail1" placeholder="Enter username" name="username" > </div> <table style="width:100%"> <tr> <td> <div> <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" name="password"> </div> </td>
填写浏览器访问地址进行访问:http://10.0.0.30:8000/
会看到登陆首页,输入正确用户名和密码会进入状态页。
登陆控制
顾名思义,在访问页面前必须先登陆
为moments.views.py里的每一个函数加上修饰器,在访问页面前必须先登陆
from django.shortcuts import render from django.http import HttpResponse # Create your views here.i from .models import WeChatUser,Status from django.contrib.auth.decorators import login_required def home(request): return render(request,"homepage.html") @login_required def show_user(request): po = {"name": "Xiao Po", "region": "Xi'an", "motto": "I love Xi'an", "pic": "Po2.jpg", "email": "po@disney.com" } return render(request,"user.html",{"user":po}) @login_required def show_status(request): statuses = Status.objects.all() #import pdb #pdb.set_trace() print(statuses.query) return render(request,"status.html",{"statuses": statuses}) @login_required def submit_post(request): return render(request,"my_post.html")
现在你会发现:访问任何页面 ,如http://10.0.0.30:8000/status
都会强制跳转到登陆页面,先登陆。
案例2:修改表单
post.html:
{% extends "base.html" %} {% block title %}Status{% endblock %} {% block post %}class="active"{% endblock %} {% block content %} <div class="container"> <div class="row"> <form method="post" enctype="multipart/form-data"> {% csrf_token %} <textarea name="text" class="form-control" rows="5"></textarea> <input type="file" id="exampleInputFile" name="pic"> <button style="float:right;margin-top:22px" type="submit" class="btn btn-primary btn-lg">Submit</button> </form> </div> <hr> </div> {% endblock %}
上传文字
moments.view.py:
from django.shortcuts import render,redirect @login_required def submit_post(request): user = WeChatUser.objects.get(user=request.user) text = request.POST.get("text") if text: status = Status(text=text, user=user) status.save() return redirect("/status") return render(request,"my_post.html")
上传图片
moments.view.py:
from django.shortcuts import render,redirect @login_required def submit_post(request): user = WeChatUser.objects.get(user=request.user) text = request.POST.get("text") upload_file = request.FILES.get("pic") if upload_file: file_name = upload_file.name with open("./moments/static/image/{}".format(file_name),'wb') as file_handler: for block in upload_file.chunks(): file_handler.write(block) else: file_name = "" if text: status = Status(text=text, user=user,pics=file_name) status.save() return redirect("/status") return render(request,"my_post.html")
改变显示顺序(最新在前)
moments.models.py:
class Meta: ordering = ["-id"]