51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1433|回复: 1
打印 上一主题 下一主题

Django实现简易博客

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-1 15:03:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.首先,我们打开终端创建一个Django项目:django-admin startproject test
2.然后创建一个app:python manage.py startapp blog
3.在settings.py里面配置好端口:ALLOWED_HOSTS = ['*']
以及数据库:DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE':'django.db.backends.mysql', # 数据库的存储引擎
'NAME':'test_django3',
'USER':'xps',
'PASSWORD':'qwe123',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}

4.在项目的_init_.py配置使用mysql:
  1. import pymysql

  2. pymysql.install_as_MySQLdb()
复制代码
5.为blog创建一个urls.py,并用主路由给它分配路由:
  1. from django.urls import path, re_path
  2. from . import views


  3. urlpatterns = [
  4.     path('add/',views.add,name='blog_add'),
  5.     path('list/',views.list,name='blog_list'),
  6.     path('detail/<blog_id>/',views.detail,name='blog_detail'),
  7.     path('index/',views.index,name='blog_index'),
  8.     path('edit/<blog_id>',views.edit,name='blog_edit'),
  9.     path('delete/<blog_id>/',views.delete,name='blog_delete'),

  10. ]
复制代码
6.然后我们在app里面建立model:
  1. from django.db import models

  2. # Create your models here.

  3. # 博客表
  4. class BlogModel(models.Model):
  5.     id = models.AutoField(primary_key=True)
  6.     title = models.CharField(max_length=100, blank=True)
  7.     content = models.TextField()
复制代码
7.settings.py里面配置模板路径:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True, # 设置为True之后,app得注册, 会去app里面的templates找模板
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

8.建立要用到的模板:
/templates/blog/demo_base.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>{% block title %}
  6.     {% endblock %}</title>
  7. </head>
  8. <body>
  9. {% block content %}
  10.      <div>
  11.      <a href="{% url 'blog_index' %}">主页</a>
  12.     </div>
  13. {% endblock %}
  14. {% block bodyblock %}
  15. {% endblock %}
  16. </body>
  17. </html>
复制代码
templates/blog/demo_add.html
  1. {% extends 'blog/demo_base.html' %}
  2. {% block title %}
  3.     添加博客
  4. {% endblock %}
  5. {% block bodyblock %}
  6.     <h1>添加新文章</h1>
  7.     <form action="{% url 'blog_add' %}" method="POST">
  8.         {% csrf_token %}
  9.         标题<input type="text" autocomplete="off" id="title"
  10.                  placeholder="请输入标题" name='title'> <br> <br><br>
  11.         内容 <textarea name="content" id="content"
  12.                      placeholder="请输入内容" cols="30" rows="10"></textarea>
  13.         <button type="submit">发布博客</button>
  14.     </form>
  15. {% endblock %}
  16. t
复制代码
templates/blog/demo_list.html
  1. {% extends 'blog/demo_base.html' %}
  2. {% block title %}
  3.     文章列表
  4. {% endblock %}
  5. {% block bodyblock %}
  6.     <h1 style="margin-left: 100px">文章列表</h1>
  7.     <table width="400px">
  8.         <thead style="font-size:20px">
  9.             <tr>
  10.                 <th>标题</th>
  11.                 <th>操作</th>
  12.             </tr>
  13.         </thead>
  14.     <tbody>
  15.         {% for blog in blog_list %}
  16.             <tr>
  17.                 <th><a href="{% url 'blog_detail' blog_id=blog.id %}">{{ blog.title }}</a></th>
  18.                 <th><a href="{% url 'blog_edit' blog_id=blog.id %}">编辑</a> | <a href="{% url 'blog_delete' blog.id %}">删除 </a></th>
  19.             </tr>
  20.         {% endfor %}
  21.     </tbody>
  22.     </table>
  23. {% endblock %}
复制代码
templates/blog/demo_detail.html
  1. {% extends 'blog/demo_base.html' %}
  2. {% block title %}
  3.     文章详情
  4. {% endblock %}
  5. {% block bodyblock %}
  6.     <h1>{{ blog.title }}</h1>
  7.     {{ blog.content }}
  8. {% endblock %}
复制代码
templates/blog/demo_index.html
  1. {% extends 'blog/demo_base.html' %}
  2. {% block title %}
  3.     博客首页
  4. {% endblock %}
  5. {% block bodyblock %}
  6.     <tr>
  7.         <td><a href="{% url 'blog_add' %}">添加文章</a></td>
  8.         <td><a href="{% url 'blog_list' %}">文章列表</a></td>
  9.     </tr>
  10. {% endblock %}
复制代码
/templates/blog/demo_edit.py
  1. {% extends 'blog/demo_base.html' %}
  2. {% block title %}
  3.     重新编辑博客
  4. {% endblock %}
  5. {% block bodyblock %}
  6.     <h1>重新编辑博客</h1>
  7.     <form action="" method="POST">
  8.         {% csrf_token %}
  9.         标题<input type="text" autocomplete="off" id="title"
  10.                  placeholder="请输入标题" name='title' value={{ title2 }}>
  11.         <br> <br><br>

  12.         内容 <textarea name="content" id="content"
  13.                      placeholder="请输入内容" cols="30" rows="10">{{ content2 }}</textarea>
  14.         <button type="submit">发布博客</button>
  15.     </form>
  16. {% endblock %}
  17. t
复制代码
9.接下来就是视图函数的编写
  1. from django.shortcuts import render,redirect,reverse
  2. from django.http import HttpResponse

  3. # 简易博客
  4. from .models import BlogModel


  5. # 博客主页
  6. def index(request):
  7.     return render(request, 'blog/demo_index.html')

  8. # 添加博客
  9. def add(request):
  10.     if request.method == 'GET':
  11.         return render(request,'blog/demo_add.html')
  12.     elif request.method == 'POST':
  13.         title = request.POST.get('title')
  14.         content = request.POST['content']
  15.         blog =BlogModel(title=title, content=content)
  16.         blog.save()
  17.         return redirect(reverse('blog_list'))
  18.     else:
  19.         return HttpResponse('不能处理的操作')

  20. #博客列表
  21. def list(request):
  22.     blog_list = BlogModel.objects.all()

  23.     return render(request, 'blog/demo_list.html',
  24.                   context={'blog_list':blog_list}
  25.                   )

  26. #文章详情
  27. def detail(request, blog_id):
  28.     # 通过id拿到当前的文章
  29.     blog = BlogModel.objects.get(id=blog_id)  # 返回的是一共对象  get有两个就不行了
  30.     # blog = BlogModel.objects.filter(id=blog_id)  #返回的是QuerySet,在模板里面使用blog.first.title拿到对象的属性
  31.     return render(request, 'blog/demo_detail.html',
  32.                   context={'blog':blog}
  33.                   )


  34. # 删除文章
  35. def delete(request, blog_id):
  36.     blog = BlogModel.objects.get(id=blog_id)
  37.     if blog:
  38.         blog.delete()
  39.     return redirect(reverse('blog_list'))

  40. #编辑文章
  41. def edit(request,blog_id):
  42.     if request.method == 'GET':
  43.         blog = BlogModel.objects.get(id= blog_id)
  44.         return render(request,'blog/demo_edit.html',
  45.                       context={'title2':blog.title,
  46.                                 'content2':blog.content,
  47.                                 }
  48.                       )
  49.     elif request.method == 'POST':
  50.         title = request.POST.get('title')
  51.         content = request.POST['content']
  52.         blog =BlogModel.objects.filter(id=blog_id)
  53.         # print(blog)
  54.         # blog =BlogModel.objects.get(id=blog_id)
  55.         # blog = BlogModel(title=title,content=content)
  56.         # blog.save()   # 用get返回来的是一共对象,用属性来修改
  57.         blog.update(title=title,content=content) # filter查出来的是QuerySet,有update方法
  58.         return redirect(reverse('blog_list'))
  59.     else:
  60.         return HttpResponse('修改文章出现未知错误!')
复制代码
10.容易出现问题的几个地方:
(1).url里面的传参与模板里面的参数传递容易混乱,一定要搞清楚!
(2). 编写视图函数的时候,BolgModel.objects.filter与BolgModel.objects.get一定要分清,前者返回的是QuerySet类型的,后者返回的是一个对象。

刚起步,有不懂的地方或者要指正的地方还请大神要指出来。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-27 05:01 , Processed in 0.061759 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表