下面通过一个简要案例来了解静态文件的基本使用。
首先,在webtest/settings.py文件中定义静态文件存放的物理目录;
# 静态资源的访问路径 STATIC_URL = '/static/' # 配置静态资源的放置目录 STATICFILES_DIRS = [os.path.join(base_DIR,"static"),]
接着在项目根目录下创建static目录,再创建images、css、js目录,并在images中保存一张照片;
在book/views.py文件中定义test_static()视图函数并配置url;
def test_static(request):
return render(request,'book/test_static.html')
url(r"^test_static",test_static),
在templates/book下创建test_static.html文件;
Title
{% load static from staticfiles %}
首页
效果如下:
2.上传图片
在上传图片之前,先在book/models.py中创建一个包含图片的模型类PostImg,并将模型类的一个属性值定义为models.ImageField类型;
class PostImg(models.Model):
picture = models.ImageField(upload_to='avatar')
def __str__(self):
return self.picture
class meta:
verbose_name_plural = "上传图片"
接着生成迁移文件并生成相应的数据表;
python manage.py makemigrations python manage.py migrate
打开webtest/settings.py文件,设置图片保存路径(因为是静态文件,所以保存在static目录下);
# 对于用户上传的资源 # 访问上传资源的路径 MEDIA_URL = "/media/" # 存储上传资源的路径 MEDIA_ROOT = os.path.join(base_DIR,"static/media")
在static目录下创建media目录,再创建应用名称的目录;
在Django中上传图片包括两种方式,分别是:在后台管理页面中上传图片、在自定义form表单中上传图片;
(1)后台管理上传图片
首先,打开book/admin.py文件,进行注册;
class PostImgAdmin(admin.ModelAdmin):
list_display = ['id', 'picture']
# 注册
admin.site.register(PostImg,PostImgAdmin)
打开浏览器运行后,添加图片并保持,这时可查到表中的数据,且图片被保存在目录static/media/avatar下;
(2)自定义form表单上传图片
打开book/views.py文件,创建test_upload()视图函数并配置url;
def test_upload(request):
if request.method == 'GET':
return render(request,'book/test_upload.html')
else:
# imgObj = request.FILES.get('avatar') -- 图片对象
# imgObj.name 获取图片的原始名字
# imgObj.file 获取图片的二进制代码
imgObj = request.FILES.get('avatar')
fname = os.path.join(settings.MEDIA_ROOT,imgObj.name)
with open(fname,'wb') as rfile:
data = imgObj.file.read()
rfile.write(data)
return HttpResponse("ok")
url(r"^test_upload",test_upload),
在templates/book目录下创建模板test_upload.html;
自定义表单上传图片
效果如下:
3.分页处理
首先,打开book/views.py文件,创建show_books()视图函数并配置url;
def show_books(request,pageIdx):
# 查询出所有的满足条件的数据
bookslist = BookInfo.objects.filter(is_delete = 0)
# 使用Paginator对查询出的数据做分页处理
paginator = Paginator(bookslist,3)
# 整理当前页的页码
if pageIdx == "":
pageIdx = 1
pageIdx = int(pageIdx)
# 通过Paginator创建出来的对象的page方法获取到当前也应该显示的图书信息
pageObj = paginator.page(pageIdx)
# 还需要知道页码列表
codelist = paginator.page_range
return render(request,'book/show_books.html',
{'pageIdx':pageIdx,
'pageObj':pageObj,
'codelist':codelist,
'total':paginator.count,
'totalPage':paginator.num_pages
})
url(r"^show_books/(d+)",show_books),
接着,创建模板show_books.html;
分页显示数据
| 编号 | 书名 | 总页数 |
|---|---|---|
| {{ book.id }} | {{ book.bname }} | {{ book.bpage }} |
| {% if pageObj.has_previous %} { pageObj.previous_page_number }}">上一页 {% else %} 上一页 {% endif %} {% for code in codelist %} {% if pageIdx == code %} {{ code }} {% else %} { code }}">{{ code }} {% endif %} {% endfor %} {% if pageObj.has_next %} { pageObj.next_page_number }}">下一页 {% else %} 下一页 {% endif %} | ||
效果如下:
4.重写模板
在book/templates/目录下创建admin目录,再从当前虚拟环境中的Django的目录下找到admin的模板,将其内容拷贝到上面创建好的admin目录里,这里以base_site.html为例;
{% extends "admin/base.html" %}
{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
{% block branding %}
hihi{{ site_header|default:_('Django administration') }}
{% endblock %}
{% block nav-global %}{% endblock %}
效果如下:



