本文以注册头像为例讲解一下ImageField怎么用。
在models.py里面定义, 这个是用来写到数据库里面的。
def custom_path(instance, filename):
ext = filename.split('.')[-1]
filename = '{}.{}'.format(uuid.uuid4().hex[:10], ext)
return filename
class Operator(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=16, unique=True)
photo = models.ImageField(null = True, blank=True, upload_to=custom_path)
def __str__(self):
return self.name
在settings.py中加入下面的配置。这样所有的图片都会保存到media这个文件夹。
MEDIA_ROOT = 'media/'
MEDIA_URL = 'media/'
在views.py首先定义一个forms。不了解的话可以去百度一下Django forms。
from django import forms
from .models import Operator
class UserForm(forms.Form):
username = forms.CharField(label='login name',max_length=50)
password = forms.CharField(label='password',widget=forms.PasswordInput())
photo = forms.ImageField(label='your photo')
这个UserForm是跟models.py定义的field对应的。
接着我们还需要写一个HTML
register.html
{% load static %}
注册页面
def register(request):
if request.method == 'POST':
#如果存在图片field,那么request.FILES是必要的,否则会报错。
userform = UserForm(request.POST, request.FILES)
if userform.is_valid():
username = userform.cleaned_data['username']
password = userform.cleaned_data['password']
photo = userform.cleaned_data['photo']
#保存数据
new_operator = Operator.objects.create(username=username, password=password, photo = photo)
#调用save()之后,图片会自动保存到media文件夹下。
new_operator.save()
return HttpResponse('regist success!!!')
else:
userform = UserForm()
return render(request, 'register.html',{'userform':userform})
在app url中添加下面的字段
urlpatterns = [
path('register/', views.register, name='register'),
]
上述代码是在Django 2.1.1中跑过的。1.x的版本url配置会有些不同。