Django简单文章发布

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/85369173

一 发布和显示文章思维导图

二 预备知识

1 Django内置的slugify

(venv) E:\Django\mysite\mysite>python manage.py shell
Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.utils.text import slugify
>>> slugify("Learn Django every Day")
'learn-django-every-day'                  # Django内置slugify对英文的作用
>>> slugify("每天学Django")
'django'                                             #Django内置slugify对中文不起作用

2 第三方库awesome-slugify

2.1 安装

(venv) E:\Django\mysite\mysite>pip install awesome-slugify

2.2 实践

(venv) E:\Django\mysite\mysite>python manage.py shell
Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from slugify import slugify
>>> slugify("每天学Django")
'Mei-Tian-Xue-Django'
>>> slugify("Learn Django every day")
'Learn-Django-every-day'

三 简单文章发布

1 创建数据模型类

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from django.core.urlresolvers import reverse
from slugify import slugify

class ArticleColumn(models.Model):
    # ForeignKey实现ArticleColumn与User之间一对多的关系
    user = models.ForeignKey(User, related_name='article_column')
    column = models.CharField(max_length=200)
    created = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.column


class ArticlePost(models.Model):
    author = models.ForeignKey(User, related_name="article")
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=500)
    column = models.ForeignKey(ArticleColumn, related_name="article_column")
    body = models.TextField()
    # 得到文章发布时的日期和时间
    created = models.DateTimeField(default=timezone.now)
    updated = models.DateTimeField(auto_now=True)


    class Meta:
        ordering = ("title",)
        # 对数据库中的这两个字段建立索引,会通过每篇文章的id和slug获取该文章对象
        # 这样建立索引后,能提高文章对象的速度
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.title

    # 对save方法进行重写,主要实现slugify操作
    def save(self, *args, **kargs):
        self.slug = slugify(self.title)
        super(ArticlePost, self).save(*args, **kargs)

    # 获取某篇文章对象的URL
    def get_absolute_url(self):
        return reverse("article:article_detail", args=[self.id, self.slug])

执行如下命令,创建模型:

(venv) E:\Django\mysite\mysite>python manage.py makemigrations
(venv) E:\Django\mysite\mysite>python manage.py migrate

2 创建表单类

# 该表单用于提交文章,包含文章标题和文章内容
class ArticlePostForm(forms.ModelForm):
    class Meta:
        model = ArticlePost
        fields = ("title", "body")

3 创建视图函数

@login_required(login_url='/account/login')
@csrf_exempt
def article_post(request):
    if request.method == "POST":
        # 获得表单
        article_post_form = ArticlePostForm(data=request.POST)
        if article_post_form.is_valid():
            cd = article_post_form.cleaned_data
            try:
                # 将表单数据放入到article_post_form关联的模型ArticlePost
                new_article = article_post_form.save(commit=False)
                # 文章关联的作者
                new_article.author = request.user
                # 文章关联的类型
                new_article.column = request.user.article_column.get(id=request.POST['column_id'])
                # 保存到数据库
                new_article.save()
                return HttpResponse("1")
            except:
                return HttpResponse("2")
        else:
            return HttpResponse("3")
    else:
        article_post_form = ArticlePostForm()
        # 查得该用户的所有栏目
        article_columns = request.user.article_column.all()
        # 入参包括表单和栏目
        return render(request, "article/column/article_post.html",
                      {"article_post_form": article_post_form, "article_columns": article_columns,})

4 设置URL

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^article-column/$', views.article_column, name="article_column"),
    url(r'^rename-column/$', views.rename_article_column, name="rename_article_column"),
    url(r'^del-column/$', views.del_article_column, name="del_article_column"),
    # 配置文章提交URL
    url(r'^article-post/$', views.article_post, name="article_post"),
]

5 编写模板

{% extends "article/base.html" %}
{% load staticfiles %}
{% block title %}article column{% endblock %}
{% block content %}
<div style="margin-left:10px">
    <form class="form-horizontal" action="." method="post">{% csrf_token %}
        <div class="row" style="margin-top: 10px;">
            <div class="col-md-2 text-right"><span>标题:</span></div>
            <div class="col-md-10 text-left">{{article_post_form.title}}</div>
        </div>
        <div class="row" style="margin-top: 10px;">
            <div class="col-md-2 text-right"><span>栏目:</span></div>
            <div class="col-md-10 text-left">
                <select id="which_column">
                    {% for column in article_columns %}
                    <option value="{{column.id}}">{{column.column}}</option>
                    {% endfor %}
                </select>
            </div>
        </div>
        <div class="row" style="margin-top: 10px;">
            <div class="col-md-2 text-right"><span>内容:</span></div>
            <div class="col-md-10 text-left">{{article_post_form.body}}</div>
            <!--<div id="editormd" class="col-md-10 text-left">-->
                <!--<textarea style="display:none;" id="id_body"></textarea>-->
            <!--</div>-->
        </div>
        <div class="row">
            <input type="button" class="btn btn-primary btn-lg" value="发布" onclick="publish_article()">
        </div>
    </form>
</div>
<script type="text/javascript" src='{% static "js/jquery.js" %}'></script>
<script type="text/javascript" src="{% static 'js/layer.js'%}"></script>
<script type="text/javascript">
function publish_article(){
    var title = $("#id_title").val();
    var column_id = $("#which_column").val();
    var body = $("#id_body").val();
    $.ajax({
        url: "{% url 'article:article_post' %}",
        type: "POST",
        data: {"title":title, "body":body, "column_id":column_id},
        success: function(e){
            if(e=="1"){
            layer.msg("发布成功!");
            }else if(e=="2"){
            layer.msg("发布失败!") ;
            }else{
            layer.msg("是不是有没有填写的项目?都必须写,不能空。");
            }
        },
    });
}
</script>
{% endblock %}

6 编写入口

<div class="bg-info">
    <div class="text-center" style="margin-top: 5px;">
        <p><h4>文章管理</h4></p>
        <p><a href="{% url 'article:article_column'%}">栏目管理</a></p>
        <p><a href="{% url 'article:article_post'%}">发布文章</a></p>
    </div>
</div>

7 测试

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/85369173
今日推荐