【问题标题】:two copies of images are stored each time I upload an image in django?每次我在 django 中上传图像时都会存储两个图像副本?
【发布时间】:2014-08-02 06:52:35
【问题描述】:

当我上传一张图片时,我看到它在我的项目中上传了两次。这两个位置是 /Users/myproject/media//Users/myproject/media/assets/uploaded_files/username/。我希望图像只上传到后者。为什么要上传两份,如何避免?

settings.py:

MEDIA_URL="/media/"

MEDIA_ROOT = '/Users/myproject/media/'

这里是models.py

UPLOAD_FILE_PATTERN="assets/uploaded_files/%s/%s_%s"

def get_upload_file_name(instance, filename):
    date_str=datetime.now().strftime("%Y/%m/%d").replace('/','_')
    return UPLOAD_FILE_PATTERN % (instance.user.username,date_str,filename)

class Item(models.Model):
    user=models.ForeignKey(User)
    price=models.DecimalField(max_digits=8,decimal_places=2)
    image=models.ImageField(upload_to=get_upload_file_name, blank=True)
    description=models.TextField(blank=True)

编辑: 我正在使用表单向导。这是views.py:

class MyWizard(SessionWizardView):
    template_name = "wizard_form.html"
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
    #if you are uploading files you need to set FileSystemStorage
    def done(self, form_list, **kwargs):
        for form in form_list:
           print form.initial
        if not self.request.user.is_authenticated():
            raise Http404
        id = form_list[0].cleaned_data['id']
        try:
            item = Item.objects.get(pk=id)
            print item
            instance = item
        except:
            item = None
            instance = None
        if item and item.user != self.request.user:
            print "about to raise 404"
            raise Http404
        if not item:
            instance = Item()
            for form in form_list:
                for field, value in form.cleaned_data.iteritems():
                    setattr(instance, field, value)
            instance.user = self.request.user
            instance.save()
        return render_to_response('wizard-done.html', {
            'form_data': [form.cleaned_data for form in form_list], })


def edit_wizard(request, id):
    #get the object
    item = get_object_or_404(Item, pk=id)
    #make sure the item belongs to the user
    if item.user != request.user:
        raise HttpResponseForbidden()
    else:
        #get the initial data to include in the form
        initial = {'0': {'id': item.id,
                         'price': item.price,
                         #make sure you list every field from your form definition here to include it later in the initial_dict
        },
                   '1': {'image': item.image,
                   },
                   '2': {'description': item.description,
                   },
        }
        print initial
        form = MyWizard.as_view([FirstForm, SecondForm, ThirdForm], initial_dict=initial)
        return form(context=RequestContext(request), request=request)

【问题讨论】:

  • 你能添加你的视图代码来传递图像吗?
  • @schillingt:我已经粘贴了上面的views.py。我在视图中使用表单向导。我注意到我在上面的向导类中有 file_storage。这可能是造成它的原因。但是向导类需要文件存储,否则它们不起作用

标签: django django-models django-media


【解决方案1】:

根据docs,你需要自己清理临时图像,这是发生在你身上的事情。

这是一个 issue,它刚刚合并到 master 并被反向移植。您可以在完成所有成功处理后尝试调用storage.reset

【讨论】:

  • 文档说您需要在向导未成功完成时删除文件。如果是这样,文件将被删除。
  • 我在您链接的文档中没有看到任何 storage.reset 处理程序。正如 Rohan 所说,如果向导成功完成,则不需要它
  • @Rohan:我的向导成功完成。我可以登录管理员并查看保存的模型。但是当我加载向导以进行编辑视图时,我遇到了一个相关问题。更多:stackoverflow.com/questions/24173367/…
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2021-09-27
  • 2013-08-09
相关资源
最近更新 更多