<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>django &#8211; ChaBug安全</title>
	<atom:link href="/tags/django/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 24 Aug 2018 02:50:25 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>Python3.6+Django2.0视频教程及实战开发</title>
		<link>/course/561.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Fri, 24 Aug 2018 02:48:36 +0000</pubDate>
				<category><![CDATA[教程分享]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[视频]]></category>
		<guid isPermaLink="false">/?p=561</guid>

					<description><![CDATA[Django2.0视频教程的代码 该git项目是Django2.0视频教程对应章节的代码，为了查看方便，对应章节代码在对应文件夹中。 Django2.0视频教程地址：https:/...]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2018/06/2.jpg"><img loading="lazy" class="aligncenter size-full wp-image-71" src="/wp-content/uploads/2018/06/2.jpg" alt="" width="500" height="228" /></a></p>
<h1>Django2.0<span class="wpcom_tag_link"><a href="/tags/%e8%a7%86%e9%a2%91" title="视频" target="_blank">视频</a></span><span class="wpcom_tag_link"><a href="/tags/%e6%95%99%e7%a8%8b" title="教程" target="_blank">教程</a></span>的代码</h1>
<p>该git项目是Django2.0视频教程对应章节的代码，为了查看方便，对应章节代码在对应文件夹中。</p>
<p>Django2.0视频教程地址：<a href="https://space.bilibili.com/252028233/#/channel/detail?cid=28138" rel="nofollow">https://space.bilibili.com/252028233/#/channel/detail?cid=28138</a></p>
<h2><a id="user-content-如何使用" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8" aria-hidden="true"></a>如何使用</h2>
<p>该git项目主要是提供一个可对照的代码给大家。大家一定要先照着视频把代码敲一遍，以加深印象。</p>
<p>每个文件夹对应每节课的代码。</p>
<h4><a id="user-content-1python" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#1python" aria-hidden="true"></a>1、Python</h4>
<p>Django是Python的一种web框架，需要Python才可使用。本教程使用Python3.6的版本录制，建议使用Python3.x最新版本。可打开<a href="https://www.python.org/downloads/" rel="nofollow">Python官网</a>下载并安装。</p>
<h4><a id="user-content-2虚拟环境" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#2%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83" aria-hidden="true"></a>2、虚拟环境</h4>
<p>本课程用virtualenv，你也可以使用其他虚拟环境管理Python库。</p>
<h4><a id="user-content-3一键安装库" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#3%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85%E5%BA%93" aria-hidden="true"></a>3、一键安装库</h4>
<p>每次课的代码文件夹都有一个requirments.txt文件。该文件是记录所使用库的信息。可利用该文件直接一键安装所有库。</p>
<p>启动虚拟环境之后（若有使用虚拟环境的的话），进入requirments.txt所在的目录，执行命令：</p>
<p><code>pip install -r requirements.txt</code></p>
<h4><a id="user-content-4第36节需要安装的mysqlclient库" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#4%E7%AC%AC36%E8%8A%82%E9%9C%80%E8%A6%81%E5%AE%89%E8%A3%85%E7%9A%84mysqlclient%E5%BA%93" aria-hidden="true"></a>4、第36节需要安装的mysqlclient库</h4>
<p>第36节需要的mysqlclient库先用pip install mysqlclient安装。不行的话，打开<a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient" rel="nofollow">https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient</a>下载mysqlclient的whl包，再用pip安装这个whl包。</p>
<h4><a id="user-content-5启动本地服务" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#5%E5%90%AF%E5%8A%A8%E6%9C%AC%E5%9C%B0%E6%9C%8D%E5%8A%A1" aria-hidden="true"></a>5、启动本地服务</h4>
<p>进入项目根目录，执行命令：</p>
<p><code>python manage.py runserver</code></p>
<h2><a id="user-content-目录大纲" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#%E7%9B%AE%E5%BD%95%E5%A4%A7%E7%BA%B2" aria-hidden="true"></a>目录大纲</h2>
<p>01.什么是Django</p>
<ul>
<li>Django是Python Web框架</li>
<li>Django的特点</li>
<li>安装Python3</li>
<li>安装Django2.0</li>
</ul>
<p>02.入门仪式：Hello World</p>
<ul>
<li>创建Django项目</li>
<li>&#8220;Hello, world&#8221;</li>
<li>初步介绍urls路由</li>
<li>创建超级管理员，进入后台管理界面</li>
</ul>
<p>03.Django基本应用结构</p>
<ul>
<li>什么是Django应用</li>
<li>创建Django应用</li>
<li>初步介绍models模型</li>
<li>模型同步到数据库</li>
<li>简单把模型展现到后台管理界面</li>
</ul>
<p>(完善中&#8230;)</p>
<h2><a id="user-content-注意" class="anchor" href="https://github.com/HaddyYang/django2.0-course/blob/master/README.md#%E6%B3%A8%E6%84%8F" aria-hidden="true"></a>注意</h2>
<p>我后面会继续把其他代码和说明补充完整。 admin后台用户名是ysh，密码是test123456</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[Y4er]6月份作业之Django开发个人博客</title>
		<link>/code/436.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Mon, 25 Jun 2018 13:11:53 +0000</pubDate>
				<category><![CDATA[编程学习]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[博客]]></category>
		<guid isPermaLink="false">/?p=400</guid>

					<description><![CDATA[前言 在学习Python的过程中，觉得有必要学一学Python做web开发，而django作为一种优秀的Python Web框架，自然成为了我的首选，经过不到一个月的学习，总算搞清...]]></description>
										<content:encoded><![CDATA[<h1>前言</h1>
<p>在学习Python的过程中，觉得有必要学一学Python做web开发，而<span class="wpcom_tag_link"><a href="/tags/django" title="django" target="_blank">django</a></span>作为一种优秀的Python Web框架，自然成为了我的首选，经过不到一个月的学习，总算搞清楚了django的大部分结构和基本的语法，如果你想学django，就和我一起来做一个用django开发的小型个人<span class="wpcom_tag_link"><a href="/tags/%e5%8d%9a%e5%ae%a2" title="博客" target="_blank">博客</a></span>吧！</p>
<h1>了解django</h1>
<p>django是遵循MVC设计模式的框架，MVC是Model、View、Controller这三个单词的缩写，分别代表了模型，视图，控制器。对于我个人的理解来讲，模型用来与数据库进行交互，视图用来封装html、js、css，控制器则用来处理程序的请求、逻辑结构等。</p>
<h1>准备工作</h1>
<p>Python3+django2.0+PycharmPro2018</p>
<h1>创建项目</h1>
<p>你可以使用Pycharm创建，更加方便。</p>
<p>你也可以使用命令行创建，django-admin startproject myblog，当然前提是你已经安装了django，并且cd到了你想把项目创建到哪个目录的具体位置。一行命令创建了一个myblog的项目，接下来我们就该创建app了，先来讲下app与项目之间的关系。</p>
<h1>项目和app之间的关系</h1>
<p>对于django来说，项目只是一个大框架，他的具体功能还需要在app里面实现，app所对应的就是一个一个的功能模块，比如拿chabug来说，有用户模块，也有文章模块，也有专题模块。</p>
<p>你可以进入到项目的目录，然后这样来创建app <code>python3 manage.py startapp blog</code></p>
<h1>运行</h1>
<p>在Pycharm里面你只需要点击右上角的运行按钮就可以运行了，默认是运行在本地的8000端口，也就是127.0.0.1:8000，如果你需要在命令行里面运行，你可以这样python3 manage.py runserver 8000，当然这样运行的只能在本地访问，如何把我们的项目发布出去对公网用户开放呢？下面会讲到。</p>
<h1>项目结构</h1>
<pre class="lang:default decode:true">manage.py	项目管理脚本，你可以通过python3 manage.py help查看你能够干什么
settings.py	项目的设置都存放在这
urls.py	这个是用来配置项目的url，例如127.0.0.1/chabug/，或者127.0.0.1/chuyu
wsgi.py	部署的时候用到的，一般上用不到</pre>
<h1>URL与视图</h1>
<h2>
视图</h2>
<p>视图一般写在APP的views.py中，并且第一个参数永远是request对象，这个对象包含了一些请求信息，比如：请求方法GET、POST，头部headers信息等等，然后视图必须返回一个HttpResponseBase，比如下面这个：</p>
<pre class="lang:default decode:true">from django.shortcuts import render,HttpResponse
​
def hello(request):
    return HttpResponse("hello")</pre>
<p>当然，你现在并不能在浏览器中看到HttpResponse返回的hello，因为我们还没有定义urls.py中的内容，下面就跟我来配置一波把！</p>
<h2>URL映射</h2>
<pre class="lang:default decode:true">from django.contrib import admin
from django.urls import path
​
urlpatterns = [
    path('admin/', admin.site.urls),
]</pre>
<p>这是默认的配置，其中admin这一条是django系统自带的映射后台，不用管他。我们来添加一条url来映射我们的hello，首先从app导入views.py</p>
<pre class="lang:default decode:true">form blog import views</pre>
<p>然后添加一条映射关系</p>
<pre class="lang:default decode:true">from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),
]</pre>
<p>django会自动从urlpatterns中寻找当前请求url所对应的规则，返回相应的信息。</p>
<p>这个时候在访问127.0.0.1:8000则会出现我们在视图中返回的HttpResponse信息hello</p>
<p><a href="https://i.loli.net/2018/06/24/5b2fa27c33d15.png"><img loading="lazy" class="aligncenter size-medium" src="https://i.loli.net/2018/06/24/5b2fa27c33d15.png" width="524" height="278" /></a></p>
<h2>URL传参</h2>
<p>两种方法</p>
<p>views.py</p>
<pre class="lang:default decode:true">def A(request,id):
    text = "你请求的id是:%s " % id
    return HttpResponse(text)
urls.py

from django.contrib import admin
from django.urls import path
from blog import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),
    path('A/&lt;id&gt;', views.A),
]</pre>
<p>你可以这样访问127.0.0.1/A/id</p>
<p>第二种</p>
<p>views.py</p>
<pre class="lang:default decode:true">def B(request):
    id = request.GET.get['id']
    text = "你请求的id是:%s " % id
    return HttpResponse(text)
urls.py

from django.contrib import admin
from django.urls import path
from blog import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),
    path('B/', views.B),
]</pre>
<p>你可以这样访问 127.0.0.1:8000/B/?id=1</p>
<h2>URL反转</h2>
<p>之前我们都是通过url来访问视图函数。有时候我们知道这个视图函数，但是想反转回他的url。这时候就可以通过 reverse 来实现。示例代码如下：</p>
<pre class="lang:default decode:true">reverse("list")
&gt; /book/list/
传递参数

reverse("book:detail",kwargs={"book_id":1})
&gt; /book/detail/1</pre>
<p>URL和视图我们就暂时讲到这里，接下来我们要开始写了，模板的知识会融在其中。</p>
<h1>创建模型</h1>
<pre class="lang:default decode:true">from django.db import models
​
​
class Article(models.Model):
    title = models.CharField(max_length=50)     #文章标题
    category = models.CharField(max_length=50, blank=True)  #文章分类
    datetime = models.DateTimeField(auto_now_add=True)  #文章发表日期
    content = models.TextField(blank=True, null=True)   #文章内容
​
    def __str__(self):
        return self.title
​
    class Meta:
        ordering = ['-datetime']    #以日期倒序</pre>
<p>创建完模型后我们需要把模型同步到数据库中</p>
<pre class="lang:default decode:true">python3 manage.py makemigrations
python3 manage.py migrate</pre>
<p>然后在admin.py中注册下我们创建的模型</p>
<pre class="lang:default decode:true">from django.contrib import admin
from blog.models import Article
# Register your models here.
admin.site.register(Article)</pre>
<p>注册模型让我们在django自带的后台管理中显示出来127.0.0.1:8000/admin</p>
<p>发布文章什么的都可以在这操作。</p>
<h1>URL设计</h1>
<p>我直接贴我的代码</p>
<pre class="lang:default decode:true">from django.contrib import admin
from django.urls import path
from blog import views
​
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
    path('&lt;int:id&gt;/', views.detail, name='detail'),
    path('archives/', views.archives, name='archives'),
    path('tag/&lt;str:tag&gt;', views.tags, name='tag'),
    path('search/', views.search, name='search')
]</pre>
<h1>视图设计</h1>
<pre class="lang:default decode:true">from django.shortcuts import render, redirect
from blog.models import Article
from django.http import Http404
​
# 首页视图，展示所有的文章
def index(request):
    sessionid = request.COOKIES.get('sessionid')
    post_list = Article.objects.all()
    return render(request,'index.html',{'post_list': post_list, 'sessionid':sessionid})
​
#文章详情视图，展示详细的文章内容
def detail(request,id):
    try:
        post=Article.objects.get(id=id)
    except:
        raise Http404
    return render(request,'post.html',{'post':post})
​
#文章归档
def archives(request):
    try:
        post_list = Article.objects.all()
    except Article.DoesNotExist :
        raise Http404
    return render(request, 'archives.html', {'post_list': post_list, 'error': False})
​
#分类作为标签，展示同分类下的文章
def tags(request, tag):
    post_list = Article.objects.filter(category__iexact=tag)
    return render(request,'tags.html', {'post_list': post_list})
​
#搜索
def search(request):
    if 's' in request.GET:
        s=request.GET['s']
        if not s:
            return render(request,'index.html')
        else:
            post_list=Article.objects.filter(title__icontains=s)
            if len(post_list)==0:
                return render(request, 'archives.html',{'post_list':post_list,'error':True})
            else:
                return render(request, 'archives.html',{'post_list':post_list,'error':False})
    return redirect('index')</pre>
<h1>模板设计</h1>
<h2>父模板导航条完成</h2>
<pre class="lang:default decode:true">{% load static %}
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Index{% block title %} - MyBlog{% endblock %}&lt;/title&gt;
    &lt;link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"&gt;
    &lt;script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"&gt;&lt;/script&gt;
    &lt;link rel="stylesheet" href="http://picturebag.qiniudn.com/blog.css"&gt;
    &lt;link rel="stylesheet" href="{% static "vim.css" %}"&gt;
    {% block head %}{% endblock %}
    &lt;style&gt;
        img{
            margin-top: -20px;
            max-height: 60px;
            max-width: 150px;
        }
        .panel-body{
            width: 750px;
            margin-left: auto;
            margin-right: auto;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;nav class="navbar navbar-default"&gt;
    &lt;div class="container-fluid"&gt;
        &lt;!-- Brand and toggle get grouped for better mobile display --&gt;
        &lt;div class="navbar-header"&gt;
            &lt;a class="navbar-brand" href="{% url 'index' %}"&gt;
                &lt;img src="{% static 'logo.png' %}" alt="logo"&gt;
            &lt;/a&gt;
        &lt;/div&gt;
​
        &lt;!-- Collect the nav links, forms, and other content for toggling --&gt;
        &lt;div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"&gt;
            &lt;ul class="nav navbar-nav"&gt;
                &lt;li class="active"&gt;&lt;a href="{% url 'index' %}"&gt;首页&lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="{% url 'archives' %}"&gt;归档&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;form class="navbar-form navbar-right" action="/search/" method="get"&gt;
                &lt;div class="form-group"&gt;
                    &lt;input type="text" class="form-control" placeholder="Search" name="s"&gt;
                &lt;/div&gt;
                &lt;button type="submit" class="btn btn-default"&gt;搜索&lt;/button&gt;
            &lt;/form&gt;
            &lt;ul class="nav navbar-nav navbar-right"&gt;
                {% block nav %}
                    {% if sessionid %}
                        &lt;li&gt;&lt;a href="/admin"&gt;进入后台&lt;/a&gt;&lt;/li&gt;
                    {% else %}
                        &lt;li&gt;&lt;a href="/admin"&gt;登陆&lt;/a&gt;&lt;/li&gt;
                    {% endif %}
                {% endblock %}
            &lt;/ul&gt;
        &lt;/div&gt;&lt;!-- /.navbar-collapse --&gt;
    &lt;/div&gt;&lt;!-- /.container-fluid --&gt;
&lt;/nav&gt;
{% block content %}
{% endblock %}
&lt;footer class="footer hidden-xs"&gt;
    &lt;div class="container"&gt;
            Copyright © 2013 ChaBug. All Rights Reserved.
    &lt;/div&gt;
&lt;/footer&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>首页完成</h2>
<pre class="lang:default decode:true">{% extends 'base.html' %}
​
{% block content %}
    &lt;div class="container"&gt;
        {% for post in post_list %}
            &lt;div class="panel-body"&gt;
                &lt;div class="entry-header page-header"&gt;
                    &lt;div class="entry-title h4"&gt;
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;{{ post.title }}&lt;/a&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-meta"&gt;
                        &lt;p&gt;Time：&lt;time&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                            分类：&lt;a href="{% url 'tag' tag=post.category %}"&gt;{{ post.category }}&lt;/a&gt;
                        &lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-content" itemprop="description"&gt;
                        {% load markdown_deux_tags %}
                        {{ post.content|truncatechars_html:50 }}
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;Read More&lt;/a&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
​
            &lt;/div&gt;
        {% endfor %}
    &lt;/div&gt;
{% endblock %}</pre>
<h2>归档页面</h2>
<pre class="lang:default decode:true">{% extends "base.html" %}
​
{% block content %}
    &lt;div class="container"&gt;
        {% if error %}
            &lt;h1&gt;没找到相关文章&lt;/h1&gt;
        {% else %}
            &lt;section class="posts-collapse" id="post"&gt;
                &lt;span class="archive-move-on"&gt;&lt;/span&gt;
                &lt;span class="archive-page-counter"&gt;
                OK! 共找到 {{ post_list.count }} 篇日志。 继续努力。
                &lt;/span&gt;
            &lt;/section&gt;
        {% endif %}
        {% for post in post_list %}
            &lt;article class="post post-type-normal"&gt;
                &lt;header class="post-header"&gt;
                    &lt;div class="entry-title h4"&gt;
                        &lt;a href="{% url 'detail' id=post.id %}"&gt; &lt;span itemprop="name"&gt;{{ post.title }}&lt;/span&gt;&lt;/a&gt;
                    &lt;/div&gt;
                    &lt;div class="post-meta"&gt;
                        &lt;time class="post-time"&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                    &lt;/div&gt;
                &lt;/header&gt;
            &lt;/article&gt;
        {% endfor %}
    &lt;/div&gt;
{% endblock %}</pre>
<p>我把归档和同分类文章用了同一个模板，通过if判断来展示不同的页面。</p>
<h2>标签页面</h2>
<pre class="lang:default decode:true">{% extends 'base.html' %}
​
{% block content %}
    &lt;div class="container"&gt;
        分类:&lt;b&gt;{{ post_list.first.category }}&lt;/b&gt;下有{{ post_list.count }}篇日志。 继续努力。
        {% for post in post_list %}
            &lt;div class="panel-body"&gt;
                &lt;div class="entry-header page-header"&gt;
                    &lt;div class="entry-title h4"&gt;
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;{{ post.title }}&lt;/a&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-meta"&gt;
                        &lt;p&gt;Time：&lt;time&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                            分类：&lt;a href="{% url 'tag' tag=post.category %}"&gt;{{ post.category }}&lt;/a&gt;
                        &lt;/p&gt;
                    &lt;/div&gt;
                    &lt;div class="entry-content" itemprop="description"&gt;
                        {% load markdown_deux_tags %}
                        {{ post.content|truncatechars_html:50 }}
                        &lt;a href="{% url 'detail' id=post.id %}"&gt;Read More&lt;/a&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
​
            &lt;/div&gt;
        {% endfor %}
    &lt;/div&gt;
{% endblock %}</pre>
<h2>文章页面</h2>
<pre class="lang:default decode:true">{% extends 'base.html' %}
{% block content %}
    &lt;div class="container"&gt;
        &lt;div class="panel-body"&gt;
            &lt;div class="entry-header page-header"&gt;
                &lt;h1 class="entry-title"&gt;{{ post.title }}&lt;/h1&gt;
            &lt;/div&gt;
            &lt;div class="entry-meta"&gt;
                &lt;p&gt;Time：&lt;time&gt;{{ post.datetime|date:"Y-m-d" }}&lt;/time&gt;
                    分类：&lt;a href="{% url 'tag' tag=post.category %}"&gt;{{ post.category|title }}&lt;/a&gt;
                &lt;/p&gt;
            &lt;/div&gt;
            &lt;div class="entry-content"&gt;
                {% load markdown_deux_tags %}
                {{ post.content|markdown }}
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
{% endblock %}</pre>
<h1>markdown语法</h1>
<h2>安装markdown插件，</h2>
<p><span class="lang:default decode:true crayon-inline">pip3 install django-markdown-deux</span><br />
然后需要在settings.py中设置</p>
<pre class="lang:default decode:true">INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'article',
    'markdown_deux'
]</pre>
<p>在模板中像我那样调用</p>
<pre class="lang:default decode:true">&lt;div class="entry-content"&gt;
   {% load markdown_deux_tags %}
   {{ post.content|markdown }}
&lt;/div&gt;</pre>
<h1>后记</h1>
<p>我们的django开发个人博客总算是结束了，前端模板写的不好，你们可以自己写一波好看的。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Django中自定义Form样式</title>
		<link>/code/432.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Fri, 22 Jun 2018 15:16:00 +0000</pubDate>
				<category><![CDATA[编程学习]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">/?p=384</guid>

					<description><![CDATA[最近在学习Django的过程中，发现Django里面对表单的支持非常棒，简化了很多操作，例如可以很方便的生成Html表单，对表单进行验证以及最终的数据存储等等，简单的一个实例如下：...]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2018/06/2.jpg"><img loading="lazy" class="alignnone size-full wp-image-385" src="/wp-content/uploads/2018/06/2.jpg" alt="" width="500" height="228" /></a><br />
最近在学习Django的过程中，发现Django里面对表单的支持非常棒，简化了很多操作，例如可以很方便的生成Html表单，对表单进行验证以及最终的数据存储等等，简单的一个实例如下：</p>
<pre class="lang:default decode:true " >class AccountForm(forms.ModelForm):
nick_name = forms.CharField(label=u'用户昵称', \
help_text="请输入用户昵称")
email = forms.EmailField(label=u'电子邮件', \
help_text=u'请输入常用邮箱')
password = forms.CharField(label=u'密码', \
help_text=u'请输入密码', \
widget=forms.PasswordInput())
re_password = forms.CharField(label=u'确认密码', \
help_text=u'请再次确认密码', \
widget=forms.PasswordInput())

​
def clean_re_password(self):
password = self.cleaned_data.get("password")
re_password = self.cleaned_data.get("re_password")
if password and re_password and password != re_password:
raise forms.ValidationError((u'密码输入不一致'))
if len(password) &amp;lt; 6:
raise forms.ValidationError((u'密码至少6位'))
return re_password
​
class Meta:
model = Account
fields = ('nick_name', 'email', 'password')</pre>
<p>在模板中只需要简单的添加</p>
<pre class="lang:default decode:true " >&lt;div class="weui_cells_form"&gt;
    &lt;form id="user_form" method="post" action="url_to_submit_form"
        &lt;!-- csrf_token fields is necessary for securty --&gt;
        {% csrf_token %}
        {{account_form}}
        &lt;input type="submit" name="submit" value="注册" /&gt;
    &lt;/form&gt;
&lt;/div&gt;</pre>
<p>这样就完成了简单的表单设计。</p>
<p>Django的这种方法确实很简单，但是Django固有的表单样式比较单一，虽然可以通过widget属性添加css样式，但是明显DIY程度不够高，本着前后端分离的原则，需要将表单的样式彻底分离出来，做到完全定制。</p>
<p>具体的表单自定义方式实际在Django的官方文档里面也有提及</p>
<pre class="lang:default decode:true " >Useful attributes on {{ field }} include:
{{ field.label }}
The label of the field, e.g. Email address.
{{ field.label_tag }}
The field’s label wrapped in the appropriate HTML &lt;label&gt; tag. This includes the form’s label_suffix. For example, the default label_suffix is a colon:
&lt;label for="id_email"&gt;Email address:&lt;/label&gt;
{{ field.id_for_label }}
The ID that will be used for this field (id_email in the example above). If you are constructing the label manually, you may want to use this in lieu of label_tag. It’s also useful, for example, if you have some inline JavaScript and want to avoid hardcoding the field’s ID.
{{ field.value }}
The value of the field. e.g someone@example.com.
{{ field.html_name }}
The name of the field that will be used in the input element’s name field. This takes the form prefix into account, if it has been set.
{{ field.help_text }}
Any help text that has been associated with the field.
{{ field.errors }}
Outputs a &lt;ul class="errorlist"&gt; containing any validation errors corresponding to this field. You can customize the presentation of the errors with a {% for error in field.errors %} loop. In this case, each object in the loop is a simple string containing the error message.
{{ field.is_hidden }}</pre>
<p>通过这种方式，就可以实现对Form的完全定制，比如采用微信的样式：</p>
<pre class="lang:default decode:true " >&lt;div class="weui_cells weui_cells_form"&gt;
    {% for item in login_form %}
        &lt;div class="weui_cell"&gt;
            &lt;div class="weui_cell_hd"&gt;
                &lt;label class="weui_label"&gt;{{item.label}}&lt;/label&gt;
            &lt;/div&gt;
            &lt;div class="weui_cell_bd weui_cell_primary"&gt;
                &lt;input class="weui_input" placeholder="{{item.help_text}}" id="{{item.id_for_label}}" name="{{item.html_name}}" type="{{item.field.widget.input_type}}" /&gt;
            &lt;/div&gt;
            {% for error in item.errors %}
                    &lt;p&gt;{{error}}&lt;/p&gt;
                {% endfor%}
        &lt;/div&gt;
&lt;/div&gt;</pre>
<p>在上面的&#8221;item.field.widget.input_type&#8221;这个域在文档中也并未提及，但是这个域又相当重要，因为像输入密码日期之类的类型都是靠这个域来定义的，最后这个域是通过读Django的源代码得到的，也算是一种获得Doc的途径吧。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
