django 數據庫圖片
时间: 2024-12-28 10:24:27 浏览: 6
### 如何在 Django 中存储和检索数据库图片
#### 设置媒体文件路径
为了能够在 Django 应用中处理图像,需先配置 `MEDIA_ROOT` 和 `MEDIA_URL` 参数。这允许指定上传文件的本地目录以及这些资源在网络上的可访问地址[^1]。
```python
# settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
```
#### 创建用于管理图片的模型类
接着,在应用下的 models 文件里定义一个包含 ImageField 字段的新类来表示要保存带图的数据实体。ImageField 需要提供 upload_to 参数指明相对 media root 的子目录位置。
```python
from django.db import models
class Picture(models.Model):
title = models.CharField(max_length=255)
image = models.ImageField(upload_to='pictures/')
def __str__(self):
return self.title
```
#### 进行迁移操作使更改生效于实际使用的数据库结构上
完成上述设置之后运行 makemigrations 命令创建新的迁移脚本,并通过 migrate 来更新数据库模式以适应新加入的字段或表单设计变化[^4]。
```bash
$ python manage.py makemigrations
$ python manage.py migrate
```
#### 实现视图函数以便用户提交含有照片的信息至服务器端存档
构建适当形式的 HTML 表格配合 POST 方法发送请求给后端处理器;同时记得调整 form 标签 enctype 属性为 multipart/form-data 才能正确传递二进制资料流。
```html
<!-- templates/upload.html -->
<form method="post" action="{% url 'upload_picture' %}" enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="title"/>
<input type="file" name="image"/>
<button type="submit">Upload</button>
</form>
```
```python
# views.py
from django.shortcuts import render, redirect
from .forms import PictureForm
def picture_upload(request):
if request.method == "POST":
form = PictureForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('success_url') # Replace with your URL or view name.
else:
form = PictureForm()
return render(request, 'upload.html', {'form': form})
```
#### 构建表单类简化前端输入验证逻辑流程控制
利用 ModelForms 自动映射 model 到 html widget 并附加必要的校验规则提升开发效率减少重复劳动量。
```python
# forms.py
from django import forms
from .models import Picture
class PictureForm(forms.ModelForm):
class Meta:
model = Picture
fields = ['title', 'image']
```
#### 显示已上传的照片列表页面供浏览查阅功能实现
最后一步就是读取所有记录下来的相关对象实例集合并通过模板引擎渲染成网页呈现出来让用户能够直观看到成果。
```python
# views.py (continued from above)
from django.views.generic.list import ListView
class PictureListView(ListView):
template_name = 'picture_list.html'
context_object_name = 'pictures'
def get_queryset(self):
return Picture.objects.all()
```
```html
<!-- templates/picture_list.html -->
<ul>
{% for pic in pictures %}
<li><img src="{{pic.image.url}}" alt="{{pic.title}}"/></li>
{% endfor %}
</ul>
```
阅读全文