版权声明:本文为博主原创文章,未经博主允许不得转载。 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 测试