【问题标题】:Django: How to prepopulate file upload path with current file path?Django:如何使用当前文件路径预填充文件上传路径?
【发布时间】:2011-09-07 03:24:06
【问题描述】:

我有一个模型表单,我的视图会生成一个用于编辑内容的 HTML 表单。目前,它能够拉入当前存储的文本内容,如下所示:

@login_required
def edit_person(request, s_id, p_id):
    p = get_object_or_404(Person, id=p_id)

    if request.method == 'POST': 
        form = PersonForm(request.POST, request.FILES)
        if form.is_valid():
            p.name = request.POST['name']
            p.title = request.POST['title']
            handle_uploaded_file(request.FILES['photo'], request.FILES['photo'].name, 'media/images/people/')
            p.photo = request.FILES['photo']
            p.order = request.POST['order']  
            p.save()
            return HttpResponseRedirect('/section/'+s_id+'/')
        else:
            return HttpResponse("error")

    else:
        form = PersonForm({ 'name': p.name, 'title': p.title, 'photo': p.photo, 'order': p.order })
        return render_to_response('auth/edit-form.html', { 'form': form }, context_instance=RequestContext(request))

    return HttpResponseRedirect('/section/'+s_id+'/')

但是,照片文件路径为空白。如果用户不想更改图像,我不希望用户每次编辑某些内容时都必须上传新文件。如何让文件上传字段显示为预填充并且如果他们不更改它不会覆盖自身?谢谢。

【问题讨论】:

  • 请参阅stackoverflow.com/questions/4684013/… 了解为什么不能这样做的简要说明。
  • @George Cummins - 好的,这是有道理的。我想我的下一个问题是,如何让表单验证上传字段是否留空?我试图告诉它仅在用户上传文件时才覆盖文件,如果没有,则使用以前存在的文件。我收到一个 MultiValueDictKeyError
  • 使用p.save(commit=False) 浏览save() [1]:docs.djangoproject.com/en/dev/topics/forms/modelforms/…的文档
  • @Pannu - 谢谢!完全成功!

标签: django django-templates django-forms django-views


【解决方案1】:

信不信由你,可以做到!但是,它需要使用名为 django-file-resubmit 的自定义 django 应用程序

请注意,给定的应用仅适用于管理中的小部件,并且需要 sorl-thumbnail

你可能更喜欢使用我的 fork:

https://github.com/JordanReiter/django-file-resubmit

它是一个通用版本,可在任何使用 ModelForm 且没有任何其他先决条件的地方使用。

它非常酷,因为它会在提交时自动存储文件(即使存在验证错误)并在小部件在表单中呈现时从缓存中检索它。

这就是实现它所需要做的所有事情:

import file_resubmit.widgets

class PersonForm:
    """ existing code here """
    photo = forms.ImageField(required=False, widget=file_resubmit.widgets.ResubmitImageWidget())

【讨论】:

  • 请注意,无论表单的其余部分是否有效,这都会将文件上传到您的服务器,然后缓存它们以备后用。如果由于某种原因您在验证表单的其余部分之前根本不想这样做,那么此版本将无法使用。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多