django初体验
首先看了一遍官方的小例子,发现是标准的mvc结构,不懂mvc结构的自行了解
如何创建项目文档里有,包括一些数据库迁移等,由于我用的是django2.1最新版,python用3.6,只是走一下最简单的增删改差
首先安装django:
pip install django
创建项目:
django-admin startproject mysite
自动创建的每个文件官方文档自行了解
下面来说说我遇到的坑:
由于我将mysql服务搭在本地的虚拟机上,
所以settings.py的databases的配置是这样的
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djangodb', 'HOST': '192.168.175.130', 'USER': 'root', 'PASSWORD': '123456', 'CHARSET': 'latin1', } }
然后当然要创建model了,
然后我的model是这样的
class Images(models.Model): rid = models.IntegerField() link = models.CharField(max_length=255) cid = models.SmallIntegerField() title = models.CharField(max_length=255) backup = models.TextField() def __str__(self): return self.title
我的apps.py
class MyadminConfig(AppConfig): name = 'myadmin'
然后settings.py中导入app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog.apps.BlogConfig', 'myadmin.apps.MyadminConfig', ]
然后运行:
manage.py makemigrations myadmin
从log中猜测这步应该是通过model生成建表sql,当然肯定没有这么简单
然后执行:
manage.py migrate
这条命令会创建表,然而发现没有MySQLdb的库,那当然要装了,pip install python-mysql ,发现装不上,各种报不同类型的错,通过查文档发现python3.6已经没有这个模块了,我们需要安装pymysql,
然后在settings.py中加入一行
import os, pymysql pymysql.install_as_MySQLdb()
然后就没问题了,一切顺利,然后就是写views和tmplates了
我的index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- 可选的 Bootstrap 主题文件(一般不用引入) --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js "></script> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <style> .nav-h { background-color: aqua; } .nav-l { background-color: #fff; } .nav-container { /*background-color: #cccccc;*/ } </style> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-12 nav-h"> <p>top</p> </div> <div class="col-md-2 nav-l"> <p>left</p> </div> <div class="col-md-10 nav-container"> <div class="row"> <!-- Button trigger modal --> <button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal"> ADD </button> </div> <!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span> </button> <h4 class="modal-title" id="myModalLabel">Modal title</h4> </div> <div class="modal-body"> <form id="form-form" class="form-horizontal" action="{% url 'myadmin:ImageAdd' %}" method="post" enctype="multipart/form-data"> <input type="hidden" name="rid" value="1"> <input type="hidden" name="cid" value="1"> {% csrf_token %} <div class="form-group"> <label class="col-sm-2 control-label">标题</label> <div class="col-sm-10"> <input type="text" class="form-control" name="title"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">备注</label> <div class="col-sm-10"> <input type="text" class="form-control" name="backup"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">图片</label> <div class="col-sm-10"> <input type="file" class="form-control" name="img"> </div> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary" id="form-submit">Save changes</button> </div> </div> </div> </div> <div class="row"> <table class="table table-hover"> <tr> <th>rid</th> <th>title</th> <th>cid</th> <th>backup</th> <th>img</th> <th>操作</th> </tr> {% for i in data %} <tr> <th>{{i.rid}}</th> <th>{{i.title}}</th> <th>{{i.cid}}</th> <th>{{i.backup}}</th> <th><img src="{{i.link}}" style="width: 50px;" alt=""></th> <th> <button class="btn btn-success edit" data-id="{{i.id}}" data-title="{{i.title}}" data-backuo="{{ i.backup}}">编辑 </button> <button class="btn btn-danger del" data-id="{{i.id}}">删除</button> </th> </tr> {% endfor %} </table> </div> </div> </div> </div> </body> <script> $('#form-submit').click(function () { $('#form-form').submit(); }) $('.del').click(function () { var th = $(this) var data_id = th.attr('data-id') var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val() console.log(csrftoken) $.ajax({ beforeSend: function (xhr, settings) { xhr.setRequestHeader("X-CSRFToken", csrftoken); }, url: "{% url 'myadmin:ImageDel' %}", data: {id: data_id}, type: 'post', dataType: 'json', success: function (data) { if (data.code){ alert('删除成功') }else{ alert('删除失败') } location.reload() } }) }) </script> </html>
我的urls.py
from django.urls import path from . import views app_name = 'myadmin' urlpatterns = [ path('', views.index, name='index'), path('images/index', views.ImageIndex, name='ImageIndex'), path('images/addImage', views.ImageAdd, name='ImageAdd'), path('images/ImageDel', views.ImageDel, name='ImageDel') ]
我的views.py
from django.shortcuts import render from django.http import HttpResponse, Http404, HttpResponseRedirect, JsonResponse from django.urls import reverse from .models import Images import os, uuid # Create your views here. def index(request): return HttpResponse('hello myadmin') def ImageIndex(request): I = Images.objects.all() context = {"data": I} return render(request, 'Images/index.html', context) def ImageAdd(request): rid = request.POST.get('rid', None) cid = request.POST.get('cid', None) title = request.POST.get('title', None) print(title) backup = request.POST.get('backup', None) link = uploadFile(request.FILES['img']) I = Images(rid=rid, cid=cid, title=title, backup=backup, link=link) I.save() if I.id is None: raise Http404 return HttpResponseRedirect(reverse('myadmin:ImageIndex')) def ImageDel(request): id = request.POST.get('id', None) if id is None: return JsonResponse({'code': 0}) try: I = Images.objects.get(pk=id) I.delete() except Exception as e: return JsonResponse({'code': 0}) else: return JsonResponse({'code': 1}) def uploadFile(f): path = '/images/' baseLink = 'http://127.0.0.1:81/' if not os.path.exists(path): os.mkdir(path) filename = str(uuid.uuid1()) + f.name saveFile = path + filename with open(saveFile, 'wb+') as sf: for trunk in f.chunks(): sf.write(trunk) return baseLink + filename
都是比较简陋,没有做任何的异常处理,就写了一个增和删其他就不想写了
值得注意的是:
由于我没有设置数据库的字符集导致出现1366, "Incorrect string value: '\\xE6\\xB5\\x8B\\xE8\\xAF\\x95' for column 'title' at row 1"这个报错
我看了一下数据库的设置:
mysql> show variables like '%char%';
果然很多默认的都是latin1,发现我的表也是Latin1,然后我当然不想改数据库了,就去找model能不能设置字符集,应该数据库连接是可以设置字符集的,并没有找到,谁找到了告诉我一下,这个是非常坑的,并不是所有线上环境都是utf8的
然后我只能退而求其次了,改数据库,如何改请戳这里,https://www.cnblogs.com/HondaHsu/p/3640180.html,然后插入中文都ok了
弄到这里就不想用了,初步感觉这个框架功能虽然全,但是有点笨重,想要深入有点难度,所以下一步准备撸一下flask
浙公网安备 33010602011771号