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