许多文件以ImageField形式上传 - django

时间:2009-08-22 13:59:13

标签: django django-models upload

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

<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/')

和那样的形式(它使用模型图像):

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

并且这样看:

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

问题是我无法上传图片。我想在图像模型的两个单独实例中保存图像 我有一个错误:

  

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

感谢您提供任何帮助和回复。

已更新以提供更多信息

3 个答案:

答案 0 :(得分:8)

Man,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>

答案 1 :(得分:2)

在这里,您可以找到file upload的文档。

我将我的图像保存在表单的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()

答案 2 :(得分:1)

是什么让你认为这会起作用?您正在遍历request.FILES并尝试在每次传递文件对象的迭代时实例化一个表单。这与文档中的内容完全不同,后者告诉您传递整个request.FILES

评论后编辑看,您还没有给我们提供太多信息。您的模型有一个或两个图像吗?你为什么要分别处理这两个图像?您是要创建两个单独的模型实例,还是一个有两个图像?你究竟想做什么?

基本上你只想这样做:

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

就是这样。