ImageField用法的一个例子

本文以注册头像为例讲解一下ImageField怎么用。

第1步我们要定义一个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

第2步我们要配置一下图片上传到哪里

在settings.py中加入下面的配置。这样所有的图片都会保存到media这个文件夹。

MEDIA_ROOT = 'media/'
MEDIA_URL = 'media/'

第3步我们要写view了

在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 %}


注册页面

{{userform.as_p}} {% csrf_token %}
然后我们在views.py中写一个POST响应函数
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})

最后一步,我们要配置一下url

在app url中添加下面的字段

urlpatterns = [
    path('register/', views.register, name='register'),
]

上述代码是在Django 2.1.1中跑过的。1.x的版本url配置会有些不同。

你可能感兴趣的:(python)