跟老齐学Django 项目实战笔记
创建项目
mysite
创建应用
blog
mysit/settings.py配置app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', ]
创建数据模型类blog/models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User, related_name="blog_posts")
# related_name="blog_posts"作用是允许User反向查询到BlogArticles
body = models.TextField()
publish = models.DateTimeField(default=timezone.now())
class Meta:
ordering = ("-publish",)
# BlogArticles示例对象的显示顺序,按照publish的字段值倒叙显示
def __str__(self):
return self.title
数据库同步,生成数据库
python manage.py makemigrations python manage.py migrate
创建超级管理员
python manage.py createsuperuser
Username: admin
Email address: admin@admin.com
Password:admin123456
blog/admin.py注册模型类
from django.contrib import admin from .models import BlogArticles admin.site.register(BlogArticles)
此时访问http://127.0.0.1:8000/admin/ 用户admin登录后可看到如下界面

如下添加篇文章

save后如下:

为了使列表页展示的信息更丰富,在blog/admin.py里编辑字段如下:
个字段的用法参考:http://python.usyiyi.cn/translate/django_182/ref/contrib/admin/index.html
from django.contrib import admin
from .models import BlogArticles
class BlogArticlesAdmin(admin.ModelAdmin):
list_display = ("title", "author", "publish")
list_filter = ("publish", "author")
search_fields = ("title", "body")
raw_id_fields = ("author",)
date_hierarchy = "publish"
ordering = ["publish", "author"]
admin.site.register(BlogArticles, BlogArticlesAdmin)
展示结果:

渲染文章:
mysite/url.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
]
blog/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.blog_title, name="blog_title"),
url(r'^(?P<article_id>\d)/$', views.blog_article, name="blog_article"),
]
blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import BlogArticles
def blog_title(request):
blogs = BlogArticles.objects.all()
return render(request, "blog/titles.html", {"blogs": blogs})
def blog_article(request, article_id):
# article=BlogArticles.objects.get(id=article_id)
article = get_object_or_404(BlogArticles, id=article_id) # 找不到就跳转到404页面
pub = article.publish
return render(request, 'blog/content.html', {"article": article, "publish": pub})
titles.html 添加a标签
{% extends "base.html" %}
{% block title %} blog titles{% endblock %}
{% block content %}
<div class="row text-center">
<h1>我的博客</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<ul>
{% for blog in blogs %}
<li><a href="{{ blog.id }}">{{ blog.title }}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
content.html
{% extends "base.html" %}
{% block title %}
blog article
{% endblock %}
{% block content %}
<div class="row text-center">
<h1>{{ article.title }}</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<p class="text-center">
<span>
{{ article.author.username }}
</span>
<span style="margin-left: 20px">
{{ publish }}
</span>
</p>
<div>
{{ article.body }}
</div>
</div>
</div>
{% endblock %}
效果:

添加header与footer
引入到base.html
<body>
{% include 'header.html' %}
<div class="container">
{% block content %}
{% endblock %}
</div>
{% include 'footer.html' %}
{% block javascript %}
{% endblock %}
</body>
创建用于登录的应用account
配置mysite/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
url(r'^account/', include('account.urls', namespace='account', app_name='account')),
]
account/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^login/$', views.user_login, name="user_login"),
]
account/forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
account/views.py
from django.shortcuts import render, HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm
def user_login(request):
if request.method == "POST":
login_form = LoginForm(request.POST)
if login_form.is_valid():
cd = login_form.cleaned_data
user = authenticate(username=cd['username'], password=cd['password'])
if user:
login(request, user)
return HttpResponse("登录成功")
else:
return HttpResponse("登录失败,用户名或密码错误")
else:
HttpResponse("输入的用户名或密码格式不符合规范")
if request.method == "GET":
login_form = LoginForm()
return render(request, 'account/login.html', {"form": login_form})
渲染login.html
{% extends 'base.html' %}
{% block title %}Login {% endblock %}
{% block content %}
<div class="row text-center">
<h1>用户登录</h1>
<form action="." method="post" class="form-horizontal">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Login">
</form>
</div>
{% endblock %}

审查元素

给head.html里导航栏的login添加a标签
<li><a href="{% url 'account:user_login' %}">Login</a></li>
它将引导程序到 .mysite/urls.py和.account/urls.py中“按图索骥”。
account 是本应用的namespace(配置在./mysite/urls.py中).冒号后面是URL的name(配置在./account/urls.py中)
./mysite/urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
url(r'^account/', include('account.urls', namespace='account', app_name='account')),
]
./account/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^login/$', views.user_login, name="user_login"),
]
login.html渲染方式二
{{ form.username }}
{{ form.password }}
审查元素

使用bootstrap样式
login.html
{% extends 'base.html' %}
{% load static %}
{% block title %}Login {% endblock %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/login.css' %}">{% endblock %}
{% block content %}
<div class="row ">
<form class="form-horizontal col-sm-5 col-centered">
<div class="form-group">
<label for="id_username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
{{ form.username }}
</div>
</div>
<div class="form-group">
<label for="id_password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
{{ form.password }}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary btn-block">Sign in</button>
</div>
</div>
</form>
</div>
{% endblock %}
login.css
.col-centered {
float: none;
margin: 100px auto 0;
}
forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(widget=forms.TextInput(attrs={"class": "form-control", "placeholder": "Username"}))
password = forms.CharField(widget=forms.PasswordInput(attrs={"class": "form-control", "placeholder": "Password"}))
效果

--未完待续--
跟老齐学Django 项目实战笔记的更多相关文章
- 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)
<跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...
- Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器
最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...
- Unity3D项目实战笔记(5):延时功能的几种实现
我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...
- 《跟老齐学Python:从入门到精通》齐伟(编著)epub+mobi+azw3
内容简介 <跟老齐学Python:从入门到精通>是面向编程零基础读者的Python入门教程,内容涵盖了Python的基础知识和初步应用.以比较轻快的风格,向零基础的学习者介绍一门时下比较流 ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十五之铭文升级版
铭文一级:[木有笔记] 铭文二级: 第12章 Spark Streaming项目实战 行为日志分析: 1.访问量的统计 2.网站黏性 3.推荐 Python实时产生数据 访问URL->IP信息- ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记二十一之铭文升级版
铭文一级: DataV功能说明1)点击量分省排名/运营商访问占比 Spark SQL项目实战课程: 通过IP就能解析到省份.城市.运营商 2)浏览器访问占比/操作系统占比 Hadoop项目:userA ...
- django项目班笔记-模板抽取
目录 一.将前端静态文件放置到项目文件目录 二.模板设置 三.将静态文件拖放到项目对应目录 四.检查HTML文件中的应用是否自动更改了 4.1 文件引用没有改变的解决方法 4.2 设置static文件 ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十四之铭文升级版
铭文一级: 第11章 Spark Streaming整合Flume&Kafka打造通用流处理基础 streaming.conf agent1.sources=avro-sourceagent1 ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记二之铭文升级版
铭文一级: 第二章:初识实时流处理 需求:统计主站每个(指定)课程访问的客户端.地域信息分布 地域:ip转换 Spark SQL项目实战 客户端:useragent获取 Hadoop基础课程 ==&g ...
随机推荐
- BZOJ3544 [ONTAK2010]Creative Accounting
看不懂题,就不能写的稍微像人话点吗我去... 题目就是要找一段区间使得Σai mod m的值最大. 于是嘛...前缀和一下再贪心就好了. 先求出前i个数的前缀和s,然后用s更新解. 还有可能就是前面的 ...
- 玩转X-CTR100 l STM32F4 l TB6612直流电机调速控制
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的直流调速电机控制,X ...
- define 常量的定义和读取
define(‘常量’,‘常量值’)----------------------define来定义常量, echo 也能输出常量, get_defined_constants(true)------- ...
- iOS开发UI之Quartz2D使用(绘制基本图形)
iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...
- Locust 其他协议
Locust 是基于HTTP作为主要目标构建的,但是他同样可以扩展其他的协议,接受请求与获得返回.在编写的客户端的时候,我们就要使用到最常使用的 request_success 和 request_f ...
- 使用pace监控ajax踩过的坑
使用vue.js开发移动端的活动页面时,有时候会出现因为请求的数据没有返回而使得当前活动页结构混乱或者不美观,这个时候可以考虑使用pace.js,通过设置参数值,在ajax全部请求结束之前显示load ...
- MAC中安卓开发环境的下载
今天终于为我的Macbook Pro Retina搭建好了Android开发环境,几经折磨,差点放弃了: 总结如下:1.最好选择ADT Bundle,这里面已经集成好了Eclipse.ADT.Andr ...
- 微信小程序之蓝牙开发(详细读数据、写数据、附源码)
本文将详细介绍微信小程序的蓝牙开发流程(附源码)准备:微信只支持低功耗蓝牙也就是蓝牙4.0,普通的蓝牙模块是用不了的,一定要注意. 蓝牙可以连TTL接到电脑上,再用XCOM调试 一开始定义的变量 va ...
- calculate MAC,Lisence,Checksum and generate muti-file
/************************************************************************* * calculate MAC,Lisence,C ...
- 如何快速切换目录cd-linux
前言 cd命令是linux系统中的基本命令行,表示改变工作目录.本文主要介绍几个常用的cd命令. 系统环境 OS:ubuntu16.04. 操作过程 cd www 表示切换到www目录: cd .. ...