蓝鲸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:

Bd20-3-10.png

过滤时间:

  <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'

效果

Bd20-3-11.png

前台数据传入数据库

修改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)

在该页中找到表单并做如下修改:

Bd20-3-12.png

<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里的每一个函数加上修饰器,在访问页面前必须先登陆

Bd20-3-13.png

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

都会强制跳转到登陆页面,先登陆。

Bd20-3-6.png

案例2:修改表单

post.html:

Bd20-3-14.png

{% 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"]