10.小项目实战

小项目实战

需求

1.复习创建项目,创建app
2.复习视图、urls
3.复习数据库、model
4.复习模板
5.制作一个User、Film展示的网页

1.创建项目、创建app

django-admin startproject Film
cd Film
python3 manage.py startapp filmapp

项目结构:

|-Film
    |-Film
        |-__init__.py
        |-setting.py
        |-urls.py
        |-wsgi.py
|-manage.py
|-filmapp
    |-__init__.py
    |-admin.py
    |-apps.py
    |-migrations
        |-__init__.py
    |-models.py
    |-tests.py
    |-views.py

2.打开setting.py添加app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'filmapp' # 添加app
]

3.创建model

from django.db import models


# 用户
class User(models.Model):
    # 用户名
    name = models.CharField(max_length=20)
    # 邮箱
    email = models.EmailField()
    # 头像
    avatar = models.URLField(null=True)
    # 创建时间  自动赋值 当前时间
    created_time = models.DateTimeField(auto_created=True, auto_now_add=True)

    def __str__(self):
        return 'name=%s, email=%s' % (self.name, self.email)


class Film(models.Model):
    # 电影名称
    name = models.CharField(max_length=30)
    # 导演
    director = models.CharField(max_length=30)
    # 海报
    poster = models.URLField(null=True)
    # 上映时间
    release_time = models.DateField()
    # 添加时间
    pb_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return 'name=%s,director=%s' % (self.name, self.director)

auto_now:字段保存时会自动保存当前时间, 但要注意每次对其实例执行save()的时候都会将当前时间保存, 也就是不能再手动给它存非当前时间的值。
auto_now_add:字段在实例第一次保存的时候会保存当前时间, 不管你在这里是否对其赋值。但是之后的save()是可以手动赋值的。 也就是新实例化一个model,想手动存其他时间, 就需要对该实例save()之后赋值然后再save()。

3.1同步数据库

python3 manage.py makemigrations
python3 manage.py migrate

结果

$ python3 manage.py makemigrations
Migrations for 'filmapp':
  filmapp/migrations/0001_initial.py
    - Create model Film
    - Create model User

$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, filmapp, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying filmapp.0001_initial... OK
  Applying sessions.0001_initial... OK

makemigrations:记录下你所有的关于modes.py的改动, 比如0001_initial.py, 但是这个改动还没有作用到数据库文件

migrate:将该改动作用到数据库文件,比如产生table之类

4.创建视图

from django.shortcuts import render
from django.http import HttpRequest, HttpResponse

from filmapp.models import User,Film

def index(request):
    return HttpResponse('success')

def addUser(request):
    name = request.GET['name']
    email = request.GET['email']
    avatar = request.GET['avatar']
    u = User(name=name, email=email, avatar=avatar)
    u.save()
    return HttpResponse('添加成功')

5.添加url

from django.contrib import admin
from django.urls import path

from filmapp.views import index,addUser

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('add/', addUser),
]

6.启动服务器

python3 manage.py runserver

结果:

April 13, 2019 - 12:21:47
Django version 2.1.7, using settings 'Film.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

7.测试

在浏览器输入http://127.0.0.1:8000/
将在浏览器展示

success

7.添加用户

在浏览器输入http://127.0.0.1:8000/add?name=jack&email=jack@qq.com&avatar=https://oss.litets.com/weixin_qrcode.JPG 结果:

添加成功

为测试方便请修改,下面添加多个用户:
name=jack
email=jack@qq.com
avatar=https://oss.litets.com/weixin_qrcode.JPG

8.展示

8.1修改views.py

def index(request):
    users = User.objects.all()
    return render(request, 'index.html', {'users':users})

8.2添加模板

1.在filmapp下创建templates文件夹
2.新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>用户列表展示</h1>
<div>
    <ul>
        {% for user in users %}
            <li>
                <div>用户名:{{ user.name }}</div>
                <div>邮箱:{{ user.email }}</div>
                <img style="width: 50px" src="{{ user.avatar }}" alt="这是用户头像">
            </li>
        {% endfor %}

    </ul>
</div>
</body>
</html>

结果:

你还可以通过7.添加用户添加更多用户

9.完善

上面我们使用的浏览器添加用户,现在我们修改模版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>添加用户</h1>

<form action="/add" method="get">
    用户名:<input type="text" name="name">
    <br>
    邮箱:<input type="email" name="email">
    <br>
    头像:<input type="url" name="avatar">
    <br>
    <input type="submit" value="添加用户">
</form>

<h1>用户列表展示</h1>
<div>
    <ul>
        {% for user in users %}
            <li>
                <div>用户名:{{ user.name }}</div>
                <div>邮箱:{{ user.email }}</div>
                <img style="width: 50px" src="{{ user.avatar }}" alt="这是用户头像">
            </li>
        {% endfor %}

    </ul>
</div>
</body>
</html>

结果:

现在可以使用表单添加用户。

10.删除

使用到JQuery Ajax。 views.py添加

def delete(request):
    name = request.GET['name']
    u = User.objects.get(name=name)
    if not u:
        return HttpResponse('删除失败,用户不存在')
    else:
        u.delete()
    return HttpResponse('%s,删除成功' % u.name)

urls.py修改

from filmapp.views import index,addUser,delete

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('add/', addUser),
    path('delete/', delete),
]

修改模板index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js"></script>
    <script>
        function deleteUser(name)
        {
            $.get("/delete/?name="+name,function(data,status){
                alert("Data: " + data + "\nStatus: " + status);
              });
        }
    </script>
</head>
<body>

<h1>添加用户</h1>
<form action="/add" method="get">
    用户名:<input type="text" name="name">
    <br>
    邮箱:<input type="email" name="email">
    <br>
    头像:<input type="url" name="avatar">
    <br>
    <input type="submit" value="添加用户">
</form>

<h1>用户列表展示</h1>
<div>
    <ul>
        {% for user in users %}
            <li>
                <div>用户名:{{ user.name }}</div>
                <div>邮箱:{{ user.email }}</div>
                <img style="width: 50px" src="{{ user.avatar }}" alt="这是用户头像">

{#                添加删除按钮#}
                <button onclick="deleteUser('{{ user.name }}')">删除</button>
            </li>
        {% endfor %}

    </ul>
</div>
</body>
</html>

11.更多查询

我们修改views.py尝试复习上节的查询。

def index(request):
    # users = User.objects.all()[:1]
    # users = User.objects.filter(name__contains='o')
    users = User.objects.exclude(name__contains='0')
    #更多尝试需要你自我尝试
    return render(request, 'index.html', {'users':users})

12.作业

前面我们还创建了一个Film模型,请读者自己尝试写点东西。 时间是检验真理的唯一标准,多敲代码才能更加熟练

声明:原创文章,版权所有,转载请注明出处,https://litets.com。