思路:

  使用ajax方式将图片和文本一起通过formData提交到后台,Django后台通过request.POST和request.FILES方式接收数据

1、前端代码

{% extends 'base.html' %}
{% load staticfiles %}
{% block title %}POST ARTICLE{% endblock %}
{% block content %}
<div style="margin-left:10px">
<form class ="form-hoizontal" method ="post">{% csrf_token %}
<div class="form-group" style="margin-top: 10px;">
<label for="avatar">标题图</label>
<input type="file" class="form-control-file" name="avatar" id="avatar">
</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.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">
{% for tag in article_tags %}
<input type="checkbox" value="{{ tag.tag }}">{{ tag.tag }}</input>
{% endfor %}
</div>
</div> <div class ="row" style="margin-top:10px;">
<div class=" col-md-2 text-right"><span >内容:</span></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" src="{% static 'editor/editormd.min.js' %}"></script>
<script type="text/javascript" src="{% static "js/ajaxfileupload.js" %}"></script>
<script type="text/javascript">
$(function () {
var editor = editormd("editormd",{
width:"100%",
height:640,
syncScrolling:"single",
path:"{% static 'editor/lib/' %}"
});
});
</script> <link rel="stylesheet" href="{% static 'editor/css/style.css' %}">
<link rel="stylesheet" href="{% static 'editor/css/editormd.css' %}"> <!-- 执行上传文件操作的函数 -->
<script type="text/javascript">
function publish_article(){
var formData = new FormData();
var fileobj=$('#avatar')[0].files[0]; //注意这里的取值方式,获取文件对象
formData.append('avatarrrrr', fileobj);
{#此处的id=id_title是表单生成的,代码并没有编写此属性#}
formData.append('title', $("#id_title").val());
formData.append('column_id', $("#which_column").val());
formData.append('body', $("#id_body").val());
$.ajax({
url:"{% url 'article:article_post' %}",
{#一定不要写成小写了,坑了好久#}
type: 'POST',
{#mimeType: "multipart/form-data",#}
{#告诉jQuery不要去处理发送的数据, 发送对象。#}
processData : false,
{#告诉jQuery不要去设置Content-Type请求头#}
contentType : false,
async : false,
data: formData,
success:function (e) {
if(e=='1'){
layer.msg("成功发布");
location.href = "{% url 'article:article_list' %}";
}else if(e=='2'){
layer.msg("sorry");
} else{
layer.msg("项目名和内容必须填写");
}
},
});
}
</script>
{% endblock %}

注意:

  1、由于是post方式提交数据,form中不要忘了{% csrf_token %}

  2、提交按钮是input标签,type="button",千万不要把type=“submit”,否则会导致执行两次后台逻辑

  3、注意文件的取值方式 $('#avatar')[0].files[0],和获取文本方式不太一样,可以在浏览器console中测试验证

  4、文件和文本数据是使用formData存储的

2、model中需要加上图片字段

upload_to参数代表将图片文件放在哪里,%Y%m%d是格式化时间,创建一个当天年月日的文件夹,里面放图片文件

3、修改forms.py

因为图片也要存入数据库,所以form中也要加上该字段

4、修改settings.py配置、URL配置

settings.py中加上媒体文件配置

# 媒体文件地址
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py中加上

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
url(r'^account/', include('account.urls', namespace='account', app_name='account')),
url(r'^article/', include('article.urls', namespace='article', app_name='article')),
] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

5、进行数据迁移

执行python manage.py makemigrations 和 python manage.py migrate进行数据迁移

6、修改后台代码

@csrf_exempt
@login_wrapper
def article_post(request):
'''
文章发布功能
:param request:
:return:
'''
if request.method == 'POST':
# print('已进入article_post视图')
print('request.FILES的值为:%s' % request.FILES)
print('request.POST的值为:%s' % request.POST)
# 实例化表单对象,来自于前端ajax请求,由于有文件传输,所以此处加上requesr.FILES
article_post_form = ArticlePostForm(request.POST, request.FILES)
if article_post_form.is_valid():
cd = article_post_form.cleaned_data
try:
# ModelForm 类或者它的子类都具有save()方法,当然实例化后的article_post_form也有此方法,
# 它的效果是生成该数据对象,并将表单数据保存到数据库
# commit=False则表示只生成文章数据对象,不保存
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'])
print('正在更新文章到数据库')
new_article.avatar = request.FILES.get('avatarrrrr')
# avatar = ArticlePost(avatar=request.FILES.get('avatar', None))
# print('avatar的值为:%s' % avatar.avatar)
# print('request.POST的值为:%s' % request.POST)
# print('request.FILES的值为:%s' % request.FILES)
# print('request.FILES的值为:%s' % request.FILES.get('avatarrrrr')) print('即将保存')
new_article.save()
print('已经保存啦')
return HttpResponse('')
except:
return HttpResponse('')
else:
return HttpResponse('不合法啊')
else:
article_post_form = ArticlePostForm()
# 获取request.user用户的所有栏目article_column为ArticleColumn模型类中的user字段的related_name,其实等价于
# article_columns = ArticleColumn.objects.filter(user=request.user)
# 通过user实例,找到其名下所有的ArticleColumn实例
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})

7、测试

Django:如何给文章列表添加图片的更多相关文章

  1. Flask——向博客文章中添加图片

    未添加图片样式 添加图片设置: 1.允许渲染img标签 在数据库文章模型allowed_tags中添加img 2.给clean函数加个参数attributes=attrs, attrs = { '*' ...

  2. 织梦dede文章列表调用标签的用法和规则

    织梦dede列表标签在任何模板的网站中都可能会使用到,而且我们在仿站的时候也经常要使用到列表标签.这里主机吧就给大家讲一下文章列表以及图片列表.软件列表以及分类信息列表标签的用法,和结合div+css ...

  3. Django学习(八)---修改文章和添加文章

    博客页面的修改文章和添加新文章 从主页点击不同文章的超链接进入文章页面,就是传递了一个id作为参数,然后后台代码根据这个参数从数据库中取出来对应的文章,并把它传递到前端页面 修改文章和添加新文章,是要 ...

  4. django的分页与添加图片

    分页: 在主页面的views里写接口 导包: from django.core.paginator import Paginator 接口: id=request.GET.get("page ...

  5. Java生成PDF文档(表格、列表、添加图片等)

    需要的两个包及下载地址: (1)iText.jar:http://download.csdn.net/source/296416 (2)iTextAsian.jar(用来进行中文的转换):http:/ ...

  6. PHPCMS v9在后台文章管理列表添加类别

    进入PHPCMS v9后台—内容,进入PHPCMS的文章管理列表,要实现在文章标题前显示文章类别,就是可以直接在文章列表里看到类别,不需要点击进入编辑页面才可以看到,如下图: PHPCMS v9在后台 ...

  7. ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表

    显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据   目录 ASP.N ...

  8. 从零开始,做一个NodeJS博客(二):实现首页-加载文章列表和详情

    标签: NodeJS 0 这个伪系列的第二篇,不过和之前的几篇是同一天写的.三分钟热度貌似还没过. 1 静态资源代理 上一篇,我们是通过判断请求的路径来直接返回结果的.简单粗暴,缺点明显:如果url后 ...

  9. 利用[后台]->[类别管理]为文章前后台添加类别名称【转】

    原网址:http://blog.csdn.net/yanhui_wei/article/details/7943176 1.给专题添加文章时,可以选择类别: 2.给文章模型.图片模型.下载模型的栏目下 ...

随机推荐

  1. window环境mysql解压版配置

    1.下载并解压 到官网下载mysql-5.5.10-win32.zip,然后将mysql解压到任意路径,如:C:\mysql-5.5.10-win32 2.设置环境变量 打开计算机->属性-&g ...

  2. VB 共享软件防破解设计技术初探(二)

    VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...

  3. 97. Interleaving String (String; DP)

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...

  4. TZOJ 3533 黑白图像(广搜)

    描述 输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.如图所示的图形有3个八连块. 输入 第1行输入一个正 ...

  5. 蚁群算法(Java)tsp问题

      1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...

  6. swift UIAlertController使用 UIAlertController的宽度 为270

    添加子控件 1. 有标题, alert标题高度大概 是 40, 子控件的 Y一般在40 ,如果中间有换行, \n 的高度大概是30 2.alert的宽度 是270, 设置frame 的时候注意 /// ...

  7. 2-Qt关闭子窗口时执行特定代码

    https://blog.csdn.net/naibozhuan3744/article/details/82689434 本文主要总结在关闭qt的QWidget子窗口瞬间,执行特定代码.由于主窗口关 ...

  8. WCF的例子

    Demo的 “Service端”以本机IIS为宿主,“Client端”以WebForm项目为例. 1.新建项目:WCF>WCF Service Application: 2.删除默认文件ISer ...

  9. 如何定义一个高逼格的原生JS插件

    插件的需求 我们写代码,并不是所有的业务或者逻辑代码都要抽出来复用.首先,我们得看一下是否需要将一部分经常重复的代码抽象出来,写到一个单独的文件中为以后再次使用.再看一下我们的业务逻辑是否可以为团队服 ...

  10. db2 sql调优

    当我们发现某个SQL语句执行很慢时,可以通过查看它的访问计划来定位原因,如是否执行了合适的索引.是否采用了正确的连接方法等.但是我们发现很多用户对访问计划的生成和解释工具的使用存在很多疑惑,本文通过一 ...