1.添加一个分类的标签,和主表的关系是 外键

class Category(models.Model):
"""
分类
""" name = models.CharField('名称', max_length=16)
def __unicode__(self):# 在Python3中用 __str__ 代替 __unicode__
return self.name
class Blog(models.Model):
"""
博客
""" title = models.CharField('标题', max_length=32)
author = models.CharField('作者', max_length=16)
content = models.TextField('正文')
created = models.DateTimeField('发布时间', auto_now_add=True) category = models.ForeignKey(Category, verbose_name='分类')
tags = models.ManyToManyField(Tag, verbose_name='标签')

在Blog里models.ForeignKey表明是外键,在Category最后面写def __unicode() 函数返回本身,是为了在后天管理时能显示分类的详细信息,而不是全是显示category

views的代码:

            form = CommentForm2(request.POST) ##获取html中post的所有数据,将CommentForm2涉及到的传给form
       cleaned_data = form.cleaned_data ##将这些参数传递给cleaned_data,, cleaned_data中的值类型与字段定义的Field类型一致。 a=request.POST.get('cate_name',1) ##获取post中cate_name,获取不到的话就填写1
cleaned_data['category'] = Category.objects.get(name=a) ##因为是外键,所以要将这一条category都查出来,然后添加到blog里
Blog.objects.create(**cleaned_data) ##插入到blog

2.添加一个分类的标签,和主表的关系是 多对多

前面与分类类似,但views不同

            check_box_list = request.POST.getlist('tags_name')  ##因为是多对多,所以在html用的是多选框,会有多个参数,要用getlist
for b in check_box_list:
a=Tag.objects.get(name=b) ##先找到post的参数值
b1= Blog.objects.get(title=form.cleaned_data['title']) ##获取前面锁添加的那条Blog记录
b1.tags.add(a) ##插入刚获取的tag值(也就是上面的a),注意一定是用b1.tags(b1是指在Blog,tags是tags字段),这样才会自动实现多对对关系
         ##多对多的关系在数据库中是:例如 A,B是多对多,,在A,B都看不到对方的数据,会自动创建C表记录A和B的相连关系。

后台admin:

from django.contrib import admin

from .models import Blog,Category,Tag

class BlogAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['title']}),
('Date information', {'fields': ['author', 'content', 'category', 'tags']}), ##这两个是进入最底层页面时,添加blog显示的参数,并可以排顺序
] list_display = ('title', 'author', 'content') ##这是点进blog时,能预览到的详情 class CategoryAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['name']}),
] list_display = ('id','name') admin.site.register(Blog, BlogAdmin)
admin.site.register(Category,CategoryAdmin)
admin.site.register(Tag)

2016/12/27

实现新建博客后跳转回首页

def get_create(request):
if request.method == 'GET':
form = CommentForm2() ##我有创建一个from2.py里面放了CommentForm2函数,views.py有导入from2,所以这句是表单初始化
ctx = {'form': form,
'category': Category.objects.all().order_by('-id'),
'tags': Tag.objects.all().order_by('-id')} ##ctx 是为了实现下面的传参,因为我在templates(也就我的html咯)有category和tags两个选框,所以这里也要加上
return render(request, 'blog-create.html',ctx)
else:
form = CommentForm2(request.POST)
if form.is_valid():
cleaned_data = form.cleaned_data
a=request.POST.get('cate_name',1)
cleaned_data['category'] = Category.objects.get(name=a)
Blog.objects.create(**cleaned_data)
check_box_list = request.POST.getlist('tags_name')
for b in check_box_list:
a=Tag.objects.get(name=b)
b1= Blog.objects.get(title=form.cleaned_data['title'])
b1.tags.add(a)
return HttpResponseRedirect(reverse('blog_get_blogs'))

与网站的交互分get和post,一般进入一个网站就是get,而从网页里面传数据出来就是post(好像post也可以访问其他网站,有种说法是get是在网址上能看到参数,而post不能,因为是后台处理吧,这句话不重要,我瞎说的 = = )

上面的代码是,如果我是进入这个网站 就会返回一个初始化的表单;但如果我是提交的话就会将所填数据传到数据空中,并返回到blog_get_blogs 这个url中。

添加分页的功能:

def get_blogs(request):
blogs = Blog.objects.all().order_by('-created')
paginator = Paginator(blogs, 3) # Show 25 contacts per page page = request.GET.get('page')
try:
blog_list = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
blog_list = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
blog_list = paginator.page(paginator.num_pages)
ctx = {
'blogs': blogs,
'blog_list': blog_list
}
return render(request, 'blog-list.html', ctx)

原本只有blogs = Blog.objects.all().order_by('-created') 和ctx以下的,只是简单实现在主页中看到所有的博客,添加中间这一块就可以完成后台的分页,当然也要配合html。

{% for blog in blog_list %}    <!-- 注意是blog_list -->
<div class="blog">
<div class="title">
<a href="{% url 'blog_get_detail' blog.id %}"><h2>{{ blog.title }}</h2></a>
</div>
<div class="info">
<span class="category" style="color: #ff9900;">{{ blog.category.name }}</span>
{% for tags in blog.tags.all%}
<span class="tags" style="color: #ff9900;">{{tags.name}}</span>
{%endfor%}
<span class="author" style="color: #4a86e8">{{ blog.author }}</span>
<span class="created" style="color: #6aa84f">{{ blog.created|date:"Y-m-d H:i" }}</span>
</div>
<div class="summary">
{{ blog.content|truncatewords:100 }}
</div>
</div>
{% endfor %} <div class="pagination">
<span class="step-links">
{% if blog_list.has_previous %}
<a href="?page={{ blog_list.previous_page_number }}">上一页</a>
{% endif %} <span class="current">
第 {{ blog_list.number }} 页,共 {{ blog_list.paginator.num_pages }} 页
</span> {% if blog_list.has_next %}
<a href="?page={{ blog_list.next_page_number }}">下一页</a>
{% endif %}
</span>
</div>

2016/12/28

复用templates模板:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{webname}}</title>
<link href="/static/css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table width="" border="" align="center" cellpadding="" cellspacing="" class="container">
<tr>
<td align="left" valign="top" style="display:block;" id ="menu">
<table width="100%">
<tr>
<td width="">
</td>
<td>
<ul id="menu">
<li><a href="/">首页</a></li>
<li><a href="/product">产品介绍</a></li>
<li><a href="/service">服务支持</a></li>
<li><a href="/download">资料下载</a></li>
<li><a href="/faq">常见问题</a></li>
<li><a href="/about">关于我们</a></li>
</ul>
</td>
<td align="right" style="padding-right:10px;">
<b> 业务专线 </b>&nbsp;: 13726206588
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="" align="center" valign="top">
{% block topAd %} {% endblock %}
</td>
</tr>
<tr>
<td>
{% block main %} {% endblock %}
</td>
</tr>
<tr style="height:30px;"> </tr>
</table> <table width="954px" border="" cellspacing="" cellpadding="" align="center" style="background-color: #272e31;">
<tr>
<td width=""></td>
<td>
<div style="margin-top:10px;margin-bottom:10px;">
<label class="mylink">收银软件系列:</label>
<a href="#" class="mylink">免费pos系统</a>&nbsp;
<a href="#" class="mylink">免费商场POS系统</a>&nbsp;
<a href="#" class="mylink">免费超市POS系统</a>&nbsp;
<a href="#" class="mylink">服装POS系统</a>&nbsp;
<a href="#" class="mylink">专卖店POS系统</a>&nbsp;
<a href="#" class="mylink">免费收银软件</a>&nbsp;
<br />
<label class="mylink"> Copyright 2012-2013 yihaomen Limited. All right reserved.</label> </div>
</td>
<td align="right">Powered by yihaomen.com</td>
<td width=""></td>
</tr>
</table> </body>
</html>
{% extends "base.html" %}
{% block topAd %}
<img src="/static/img/banner_index.jpg" width="" height="" />
{% endblock %}
{% load functionTag %}
{% block main %}
<table width="100%" border="" cellspacing="" cellpadding="">
<tr>
<td width="" align="left" valign="top" style="padding-left:12px;">
<table width="" border="" cellspacing="" cellpadding="" style="margin-bottom:14px;">
<tr>
<td><img src="/static/img/main/header_news.gif" width="" height="" /></td>
</tr>
{% display_index_announce_widget %}
<tr>
<td><img src="/static/img/main/footer.gif" width="" height="" /></td>
</tr>
</table>
{%display_index_recent_faqs%}
</td>
<td width="" valign="top">
{%display_index_news_widget%}
</td>
<td width="" align="right" valign="top" class="ourproducts">
{% display_products_widget %}
</td>
</tr>
</table>
{% endblock %}

这只是个例子,不是自己写的。

第一张图是我用使用的模板base.html,重点是里面会有{% block topAD}   {endblock} 这个里面是指可以修改里面的参数。

使用bootstrap:

官方文档:https://docs.djangoproject.com/en/1.9/howto/static-files/

先下载想要的模板,(做个人博客的话,极力推荐:http://www.cssmoban.com/cssthemes/6287.shtml)

修改urls.py文件

from django.conf import settings
from django.conf.urls.static import static urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

重点是开头要from static 和 最后一句 + XXX

在模板中首行加上
{% load staticfiles %}

模板中设计到样式的格式要改成这样
<img src="{% static "js/myexample.js" %}" alt="My image"/>

2016/12/30

发送邮件:

setting最后加上

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.126.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'ewew2150@126.com'
EMAIL_HOST_PASSWORD = 'xxx'
EMAIL_SUBJECT_PREFIX = u'django'
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

views加上

from django.core.mail import send_mail  

send_mail('title for blog', 'blog comment', 'ewew2150@126.com', ['815410098@qq.com'], fail_silently=False)
##第一个是主题,第二个是内容

动手实践记录(利用django创建一个博客系统)的更多相关文章

  1. Django完整的开发一个博客系统

    今天花了一些时间搭了一个博客系统,虽然并没有相关于界面的美化,但是发布是没问题的. 开发环境 操作系统:windows 7 64位 Django: 1.96 Python:2.7.11 IDE: Py ...

  2. Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置

    Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等 ...

  3. Django快速搭建博客系统

    Django快速搭建博客系统 一.开发环境 Windows 7(64bit) python 3.6   https://www.python.org/ Django 2.0  https://www. ...

  4. ASP.NET写的一个博客系统

    由于域名闲置,正好也有服务器空间,短期内开发了一个博客系统. 大家都来谈  http://www.djdlt.com 目前是开放注册,免费发布.(限于空间有限,图片还是尽量少传些) 网站架构: ASP ...

  5. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  6. 利用django创建一个投票网站(三)

    创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Dj ...

  7. 利用django 实现个人博客 全记录(二)

    上一篇文章已经把基础环境搭建好了 一  创建app D:\学习\python3.7.3\python manage.py startapp blog 修改 博客的 models.py ) ) def ...

  8. Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中

    背景: 之前也读过一些关于django的一些书,看过别人写的一些博客系统.但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了. 环境搭建: 环境:使用py ...

  9. 【干货】利用MVC5+EF6搭建博客系统(三)添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是N ...

随机推荐

  1. css知多少(11)——position

    1. 引言 本文将用一篇文章介绍position(定位),在学习position之前,我们应该去思考一个问题:什么情况下我们需要定位?如果没有定位将无法满足我们怎样的需求?我们要知道,被人类创造出来的 ...

  2. 解决mysql卸载后无法从新安装,卡在最后一步的问题

    mysql服务出现问题往往是最麻烦的,往往需要重装,而重装很多人卸不干净残留文件,更加装不上.在下就遇到这个问题.重装mysql到最后一步时卡在了最后一步的第二条上 解决办法就是卸载后删注册表+删数据 ...

  3. 客户关系管理系统-CRM源码

    QQ:2112326142   邮箱:jxsupport@qq.com 本公司开发的CRM源代码系统一份,附源代码,本公司产品唯一销售客服QQ号:2112326142  请联系此QQ号,以免给您的工作 ...

  4. order by 与 group by 区别

    order by 排序查询.asc升序.desc降序 示例: select * from 学生表 order by 年龄 ---查询学生表信息.按年龄的升序(默认.可缺省.从低到高)排列显示 也可以多 ...

  5. 读《乔布斯的NeXT和苹果之间,隔了这两个创业常识》

    原文链接:http://wwww.huxiu.com/article/114950/1.html 前言: 当今硅谷风头最劲的风险投资家马克·安德森曾说,硅谷每年大约诞生15-20家真正值得投资的公司. ...

  6. mysql半同步(semi-sync)源码实现

    mysql复制简单介绍了mysql semi-sync的出现的原因,并说明了semi-sync如何保证不丢数据.这篇文章主要侧重于semi-sync的实现,结合源码将semi-sync的实现过程展现给 ...

  7. Spring, MyBatis 多数据源的配置和管理

    同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其它还 ...

  8. eclipse 启动到loading workbench... 自动关闭

    是由于项目没有正常关闭运行而导致"workbench.xmi"中的"persistedState"标签还保持在运行时的配置造成的. 解决方法: 找到<wo ...

  9. 安卓虚拟机adb shell sqlite3数据库

    adb shell 连接: //http://www.cnblogs.com/xiaobo-Linux/ Android把数据都存放在data/data目录下. 我们使用cd命令转到data/data ...

  10. 一个C++版的嵌入式操作系统

     原创文章,转载请注明出处! 现世面上流传着很多嵌入式操作系统,都已经非常优秀,但本人(Sam的博客-博客园)还是自己编写了一个RTOS,不敢说优秀,但绝对是使用起来最简单的.先看一个工程截图与一段m ...