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">&times;</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


posted @ 2018-09-11 20:40  screte  阅读(118)  评论(0编辑  收藏  举报