使用django搭建一个项目

    技术2022-07-11  79

    windows7

    python 3.7

    idea

    安装django

    pip install django

    创建HelloWorld

    在D:/HelloWorld 执行

    django-admin startproject HelloWorld

    会在当前目录下生产HelloWorld项目

    使用idea打开

    在idea的Terminal 中执行(在CMD中执行卡在了Watching for file changes with StatReloader)

    python manage.py runserver

     访问 http://127.0.0.1:8000/

    设置下admin的账号密码

    访问http://127.0.0.1:8000/admin 

    输入账号和密码

     

     

    在HelloWorld的view.py中增加代码

    from django.http import HttpResponse def hello(request): return HttpResponse('Hello World! django')

     在helloWorld中的urls中配置下

    from django.contrib import admin from django.urls import path from . import view from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), url(r'^hello$', view.hello), ]

    url() 函数 Django url() 可以接收四个参数,分别是两个必选参数:regex、view 和两个可选参数:kwargs、name,接下来详细介绍这四个参数。

    regex: 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。view: 用于执行与正则表达式匹配的 URL 请求。kwargs: 视图使用的字典类型的参数。name: 用来反向获取 URL。

     

    访问 http://127.0.0.1:8000/hello

    在manage.py同级目录下新建templates目录,新建hello.html

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

    修改settings.py 中的TEMPLATES

    TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "templates")], ''' }

     在helloworld的view.py中增加

    from django.shortcuts import render def helloMap(request): context = {} context['helloMap'] = 'myHello Map' return render(request, 'hello.html', context)

     配置下urls.py

    from django.contrib import admin from django.urls import path from HelloWorld.view import hello, helloMap from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), url(r'^hello$', hello), url('helloMap/', helloMap), ]

     访问http://127.0.0.1:8000/helloMap/

     

    新建app

    先安装下mysql

    pip install mysqlclient

     新建一个app

    django-admin startapp AppTest

    会生成一个AppTest项目

    在settings.py中加入

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

    在settings中新增数据库连接信息 

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

    在AppTest的models.py中增加代码 

    from django.db import models # Create your models here. class Person(models.Model): name = models.CharField('名称', max_length=100) age = models.IntegerField('年龄') address = models.CharField('地址', max_length=300) id =models.IntegerField('编号', primary_key=True) def __unicode__(self): return self.id

    执行

    python manage.py migrate python manage.py makemigrations AppTest python manage.py migrate AppTest

    注意: 可能报错

    django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1"))

    原因是mysql的版本过低, 请至少升级mysql的版本至5.6

    全部执行完成之后,可以看到数据库中的表

    在AppTest的admin.py中增加配置

    from django.contrib import admin from AppTest.models import Person admin.site.register(Person)

    可以直接操作Person的数据库 

     操作一下网页版本

    appTest的models新增user

    class User(models.Model): user = models.CharField('账号', max_length=16) pwd = models.CharField('密码', max_length=32) id = models.AutoField('编号', primary_key=True)

    在views里面新增

    def add(request): from AppTest import models # 1 # u = models.User(user='shj') # u.save() # 2 # models.User.objects.create(user='sss',pwd='123456') dic = {'user':'wkk','pwd':'wkk'} models.User.objects.create(**dic) return HttpResponse('增加成功')

    查询

    def select(request): from AppTest import models user_list = models.User.objects.all() return render(request, 'user.html', {'user_list': user_list})

    templates/user.html 

    <!-- ~ Copyright (C) 2020 Baidu, Inc. All Rights Reserved. --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <thead> <tr> <td>账号</td> <td>密码</td> </tr> </thead> <tbody> {% for user in user_list%} <tr> <td>{{user.user}}</td> <td>{{user.pwd}}</td> </tr> {% endfor%} </tbody> </table> </body> </html>

    配置urls

    from django.contrib import admin from django.urls import path from HelloWorld.view import hello, index, helloMap from AppTest.views import add, select from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), url(r'^hello$', hello), url('helloMap/', helloMap), url('index/', index), url('appTest/add/', add), url('appTest/select/', select), ]

     

     在网页中增加数据并显示

    修改views.py,增加代码

    from django.views.decorators.csrf import csrf_protect def home(request): return render(request, 'user.html') @csrf_protect def addHtml(request): from AppTest import models if request.method == 'POST': user = request.POST['user'] pwd = request.POST['pwd'] models.User.objects.create(user=user,pwd=pwd) user_list = models.User.objects.all() return render(request, 'user.html', {"user_list": user_list})

    修改urls.pu

    urlpatterns = [ ''' url('appTest/home/', home), url('appTest/addHtml/', addHtml), ]

    修改user.tml

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/appTest/addHtml/" method="post"> {% csrf_token %} 账号: <input type = 'text' name="user" /><br /> 密码: <input type = 'password' name="pwd" /><br /> <input type = 'submit' value="增加" /> </form> <table border="1"> <thead> <tr> <td>账号</td> <td>密码</td> </tr> </thead> <tbody> {% for user in user_list%} <tr> <td>{{user.user}}</td> <td>{{user.pwd}}</td> </tr> {% endfor%} </tbody> </table> </body> </html>

    注意: 1 form的action 路径结尾需要加上 '/', 否则可能报错

    Exception Type: RuntimeError Exception Value: You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/appTest/addHtml/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

    2 如果不加入csrf,则会报错

     在浏览器中访问http://127.0.0.1:8000/appTest/home/

    增加一条数据

    一个完整的网页操作数据库 功能

    models.py

    from django.db import models class User(models.Model): user = models.CharField('账号', max_length=16) pwd = models.CharField('密码', max_length=32) id = models.AutoField('编号', primary_key=True)

    views.py

    from django.shortcuts import render from django.http import HttpResponse from django.template.context import RequestContext from django.views.decorators.csrf import csrf_protect def home(request): return render(request, 'user.html') def add(request): from AppTest import models # 1 # u = models.User(user='shj') # u.save() # 2 # models.User.objects.create(user='sss',pwd='123456') dic = {'user':'wkk','pwd':'wkk'} models.User.objects.create(**dic) return HttpResponse('增加成功') @csrf_protect def addHtml(request): from AppTest import models if request.method == 'POST': user = request.POST['user'] pwd = request.POST['pwd'] models.User.objects.create(user=user,pwd=pwd) user_list = models.User.objects.all() return render(request, 'user.html', {"user_list": user_list}) # 1 # u = models.User(user='shj') # u.save() # 2 # models.User.objects.create(user='sss',pwd='123456') dic = {'user':'wkk','pwd':'wkk'} models.User.objects.create(**dic) return HttpResponse('增加成功') def updateHtml(request): from AppTest import models if request.method == 'POST': id = request.POST['id'] user = request.POST['user'] pwd = request.POST['pwd'] models.User.objects.filter(id=id).update(user=user, pwd=pwd) user_list = models.User.objects.all() return render(request, 'user.html', {"user_list": user_list}) def select(request): from AppTest import models user_list = models.User.objects.all() return render(request, 'user.html', {'user_list': user_list}) def deleteHtml(request): from AppTest import models if request.method == 'GET': id = request.GET['id'] models.User.objects.filter(id=id).delete() user_list = models.User.objects.all() return render(request, 'user.html', {"user_list": user_list})

    urls.py

     

    from django.contrib import admin from django.urls import path from HelloWorld.view import hello, index, helloMap from AppTest.views import add, select, addHtml, home, deleteHtml, updateHtml from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), url(r'^hello$', hello), url('helloMap/', helloMap), url('index/', index), url('appTest/home/', home), url('appTest/add/', add), url('appTest/addHtml/', addHtml), url('appTest/deleteHtml/', deleteHtml), url('appTest/updateHtml/', updateHtml), url('appTest/select/', select), ]

    一个完整的增删改查页面

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/appTest/addHtml/" method="post"> {% csrf_token %} 账号: <input type = 'text' name="user" /><br /> 密码: <input type = 'password' name="pwd" /><br /> <input type = 'submit' value="增加" /> </form> <table border="1" style={margin-top: 20px}> <thead> <tr> <td>编号</td> <td>账号</td> <td>密码</td> <td>操作</td> </tr> </thead> <tbody> {% for user in user_list%} <tr> <td>{{user.id}}</td> <td>{{user.user}}</td> <td>{{user.pwd}}</td> <td> <a href="/appTest/deleteHtml/?id={{user.id}}" >删除</a> <form action="/appTest/updateHtml/" method="post"> {% csrf_token %} <input type = 'hidden' value={{user.id}} name="id" /><br /> 账号: <input type = 'text' name="user" /><br /> 密码: <input type = 'password' name="pwd" /><br /> <input type = 'submit' value="修改" /> </form> </td> </tr> {% endfor%} </tbody> </table> </body> </html>

     

    Processed: 0.013, SQL: 9