ImageField表单中上传多个文件 - Django

4

我的问题很简单。我有一个像这样的模板:

<form enctype="multipart/form-data"
action="{% url offers.views.add_offer %}" method="post">    
    <input type="file" name="image1" />
    <input type="file" name="image2" />     
    <input type="submit" value="Add" />
</form>

模型长这样:

class Image(models.Model):
    image = models.ImageField(upload_to='uploads/images/offers/')

类似这样的表单(它使用模型 Image):

class ImageForm(ModelForm):
    class Meta:
        model = Image

并且像这样查看:

    for f in request.FILES:
    # imageform:
        image = ImageForm(request.POST, f)
        image.save()

问题在于我无法上传图片。 我想将图像保存在 Image Model 的两个单独实例中。
我遇到了一个错误:

'unicode' 对象没有 'get' 属性

感谢任何帮助和回复。

提供更多信息更新

3个回答

8

伙计,Django Formsets 是你需要的:

http://docs.djangoproject.com/en/dev/topics/forms/formsets/

编辑后

视图:

def manage_images(request):
    ImageFormSet = formset_factory(ImageForm)
    if request.method == 'POST':
        formset = ImageFormSet(request.POST, request.FILES)
        if formset.is_valid():
            # do something with the formset.cleaned_data
    else:
        formset = ImageFormSet()
    return render_to_response('manage_images.html', {'formset': formset})

模板:

模板:

<form enctype="multipart/form-data" action="{% url offers.views.add_offer %}" method="post">
    {{ formset.management_form }}
    <table>
        {% for form in formset.forms %}
        {{ form }}
        {% endfor %}
    </table>
</form>

但我该如何使用它?我的问题是从request.FILES获取数据,我正在考虑。您能否给我一个示例,如何使用表单集将多个文件保存到同一模型中的多个实例中? - galuszkak

2

在这里,您将找到与文件上传相关的文档。

我在表单的save()方法中以以下方式保存我的图像:

def save(self): 
    if self.cleaned_data.get('galleryname'):
        if self.cleaned_data.get('images1'):

            path = 'images/'+ urlify(self.cleaned_data.get('galleryname'))+self.cleaned_data.get('images1').name
            destination = open(s.MEDIA_ROOT+path, 'wb+')
            for chunk in self.cleaned_data.get('images1').chunks():
                destination.write(chunk)
            p = Photo()
            p.picture="./"+path
            p.save()

在我的视图中

form = CompleteSubscriptionForm(request.POST, request.FILES, error_class=DivErrorList)
if form.is_valid(): # All validation rules pass
        form.save()

1

您认为这样会有效吗?您正在迭代request.FILES,并尝试在每次迭代中实例化一个表单,传递一个文件对象。这与文档中的内容完全不同,文档告诉您要将整个request.FILES传递进去。

在评论后进行编辑 看,您没有给我们足够的信息。您的模型是否有一个图像或两个图像?为什么要分别处理两个图像?您是想创建两个单独的模型实例,还是带有两个图像的一个模型实例?您到底想做什么?

基本上,您只需要这样做:

form = ImageForm(request.POST, request.FILES)
if form.is_valid():
    form.save()

就是这样。


那么我该怎么做?你有任何解决方案吗? - galuszkak
模型看起来像这样:class Image(models.Model): image = models.ImageField(upload_to='uploads/images/offers/')它只有一个ImageField。如果我想创建同一模型的两个单独实例,我知道如何保存一个文件/图像。就像你上面描述的那样很简单。这对我来说不是问题。我的问题是我不知道如何创建这两个实例(从request.FILES中检索文件,然后将其保存到两个分离的新实例中)。如果您需要更多信息,我可以发布它。我想将其保存到同一模型中。 - galuszkak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接