Django 使用表单上传多张图片

时间:2021-04-01 17:34:27

标签: django django-views django-templates

这可以上传单个图像。但我想像insta一样上传多个图像。在 Instagram 中,多个图像存储在滑块中。我不明白 files = request.FILES.getlist('image') 如何迭代这个列表

Views.py file

@login_required
def index(request):
    images = Image.objects.all()
    users = User.objects.filter(is_superuser=False)
    prof = Profile.objects.get(user=request.user)
    actions = Action.objects.exclude(user=request.user)
    following_ids = request.user.following.values_list('id', flat=True)
    if request.method == "POST":
        form = ImageCreateForm(request.POST, request.FILES)
        files = request.FILES.getlist('image')
        if form.is_valid():            
            description = form.cleaned_data["description"]
            image = form.cleaned_data["image"]
            new_item = form.save(commit=False)
            new_item.user = request.user
            new_item.save()
            create_action(request.user, 'Uploaded Image', new_item)
            messages.success(request, "Image Added Successfully")
            return redirect(new_item.get_absolute_url())
    else:
        form = ImageCreateForm(data=request.GET)

    if following_ids:
        # If user is following others, retrieve only their actions
        actions = actions.filter(user_id__in=following_ids)
    actions = actions.select_related('user', 'user__profile').prefetch_related('target')[:10]
    return render(request, "account/index.html", {
        'section': 'index', 
        'images': images, 
        'prof': prof, 
        'actions': actions, 
        'users': users,
        'form': form,
    })
forms.py file

from django import forms
from urllib import request
from django.core.files.base import ContentFile
from django.utils.text import slugify
from .models import Image

class ImageCreateForm(forms.ModelForm):
    image = forms.ImageField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
    class Meta:
        model = Image
        fields = ('description',)
    def clean_url(self):
        image = self.cleaned_data['image']
        valid_extensions = ['jpg', 'jpeg']
        extension = image.rsplit('.', 1)[1].lower()
        if extension not in valid_extensions:
            raise forms.ValidationError('The Given URL does not match valid image extensions.')
        return image
    
    def save(self, force_insert=False, force_update=False, commit=True):
        image = super().save(commit=False)
        url = self.cleaned_data['image']
        name = slugify(image.description)
        image_name = f'{name}'
        image.image.save(image_name, ContentFile(url.read()), save=False)

        if commit:
            image.save()
        return image
admin.py file
@admin.register(Image)
class ImageAdmin(admin.ModelAdmin):
    list_display = ['slug', 'image', 'description', 'created']
    list_filter = ['created'] 

1 个答案:

答案 0 :(得分:0)

你可以循环遍历它:

for afile in request.FILES.getlist('image'):
    mymodel = MyModel()
    mymodel .pic = afile
    mymodel .save()

当然,您需要确保可以将图像保存在模型中。