Django: Как предварительно заполнить путь загрузки файла с текущим путем файла? - PullRequest
1 голос
/ 06 сентября 2011

У меня есть модель формы, в которой мои представления генерируют 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+'/')

Однако путь к файлу фотографии пуст. Я не хочу, чтобы пользователю приходилось загружать новый файл каждый раз, когда он что-то редактирует, если он не хочет менять изображение. Как сделать так, чтобы поле загрузки файла отображалось предварительно заполненным и не перезаписывало само себя, если они не меняют его? Спасибо.

1 Ответ

2 голосов
/ 06 сентября 2011

Верьте или нет, но можно сделать! Однако для этого необходимо использовать пользовательское приложение django под названием django-file-resubmit

Обратите внимание, что приложение как указано работает только для виджетов в админке и требует sorl-thumbnail .

Вы можете предпочесть использовать мою вилку:

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())
...