菜鸡的Django学习笔记(三)完成一个博客

Model

model.py中是对数据库的操作,一个model类对应一张数据表
所以说:
1.我们在model下建一个类(也就是建一个数据表)Article,这个类要继承models.Modle类
2.这个类中,创建我们需要的字段(数据库中的变量),比如Text,Content,并用适当的函数约束

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=32, default='Unamed Title')
    content = models.TextField(Null=True)

3.接着在manage.py 中生成这样的一个数据表,执行makemigrations,在执行migrate,这样数据表(modle)就建好了

4.如何在后台呈现这个数据表呢
首先要在数据库中放入数据如下(没有这一步会出现model matching query does not exist错误)
id = 1 title = Blog content = my blog
接着view.py 中让后台数据呈现出来

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from . import models
def index(request):
    article = models.Article.objects.get(pk=1)
    return render(request, '/home/wei/PycharmProjects/myblog/Templates/index.html', {'article': article})

HTML文件中改为

<body>
<h1>{{article.title}}</h1>
<h1>{{article.content}}</h1>
</body>

这样基于数据库model的一个页面就出来了

Admin

通过使用startproject 创建的默认项目模版中,Admin 已启用,基本的配置已经自动生成,所以我们要做的就是:
确定哪些东西可以在管理员界面编辑,即在Admin中register我们在model中建好的类(数据表)
在admin.py 中添加如下代码

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from models import Article
# Register your models here.
admin.site.register(Article) 

并在model中添加def __unicode__(self):return self.title
再在terminal中创建超级用户即可

完成blog界面

  1. 博客主页面能读取所有博客文章的title并超链接(HTML页面for … in …)(view.py 换get()为all()),并且要有写文章的超链接;

  2. 博客显示界面要有修改超链接和返回超链接,并且每个博客页面的URL不同,用正则表达式匹配(view.py中每个函数就是一类页面,博客正文显示页面自然要新建一个view中的函数,urls.py记得添加,并新建一个HTML)

  3. 超链接配置,templates中提供了一种超链接配置方法
    {% url 'app_name : url_name' param %}
    app_name 和url_name在urls中配置:根url中加入namespace=blog,子url中定义url的name

  4. 博客编辑界面
    新建一个博客编辑页面,添加对应的后台代码

    • views.py 包含新建文章的函数和修改文章的函数
      • 如何区分这个博客编辑页面是新建还是修改?(通过传回Article.id分辨,id默认为0,那么如果id为0,则为新建文章,否则,为修改文章)
      • if id == 0:新建文章则直接create一个新的Article实例,分别赋值,render回主页面即可;
      • 否则, 修改文章应通过id get到所应修改的文章(实例),对该实例进行赋值,最后保存(.save),render回文章显示页面
    • urls.py 添加对应的页面url
    • html 建立文章编辑的HTML页面,注意对于Article.id == 0?进行不同的操作方式
      具体代码如下:
      views.py
def article_edit(request, art_id):
    if str(art_id) == '0':
        return render(request, '/home/wei/PycharmProjects/myblog/Templates/article_edit.html')
    article = models.Article.objects.get(pk=art_id)
    return render(request, '/home/wei/PycharmProjects/myblog/Templates/article_edit.html', {'article': article})

def edit(request):
    title = request.POST.get('title', 'TITLE')
    content = request.POST.get('content', 'CONTENT')
    art_id = request.POST.get('art_id', '0')
    if art_id == '0':
        models.Article.objects.create(title=title, content=content)
        return HttpResponseRedirect('/blog/index')
    article = models.Article.objects.get(pk=art_id)
    article.title = title
    article.content = content
    article.save()
    return render(request, '/home/wei/PycharmProjects/myblog/Templates/article_page.html', {'article': article})

urls.py

urlpatterns = [
    url(r'^index/$', views.index, name='menu'),
    url(r'^art_page/(?P<art_id>[0-9]+)$', views.article_page, name='art_page'),
    url(r'^art_edit/(?P<art_id>[0-9]+)$', views.article_edit, name='art_edit'),
    url(r'^art_edit/edit/$', views.edit, name='edit')
]

article_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Edit Page</title>
</head>
<body>
<form action="{% url 'blog:edit' %}" method="post">
    {% csrf_token %}
    {% if article %}
        <input type="hidden" name="art_id" value="{{ article.id }}" />
        <lable> 文章标题
        <input type="text" name="title" value="{{ article.title  }}" />
    </lable>
    <br/>
    <lable>文章内容
        <input type="text" name="content" value="{{ article.content }}" />
    </lable>
    <br/>
        {% else %}
    <lable> 文章标题
        <input type="hidden" name="art_id" value="0" />
        <input type="text" name="title"/>
    </lable>
    <br/>
    <lable>文章内容
        <input type="text" name="content"/>
    </lable>
    <br/>
    {% endif %}
    <input type="submit">
</form>

</body>
</html>

article_page.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ article.title }}</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<br>
<h3>{{ article.content }}</h3>
<br/>

<a href="{% url 'blog:art_edit' article.id %}">modify</a><br><a href="{% url 'blog:menu' %}">back</a>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title> 我的博客 </title>
</head>
<body>
<h1>我的 Blog</h1>
{% for article in articles %}
    <a href="{% url 'blog:art_page' article.id %}">{{ article.title }}</a>
    <br>
{% endfor %}
<br>

<a href="{% url 'blog:art_edit' 0 %}">创建新文章</a>
</body>
</html>

明天写个总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值