Загрузка изображения в ModelForm в Django?

#python #django

#python #django

Вопрос:

У меня возникли проблемы с загрузкой изображения в форму с помощью Django. Файл не отображается в моем каталоге templates / auctions и не отображается в моем шаблоне (вероятно, потому, что он никогда не загружался).

В моем views.py :

 @login_required(login_url="login")
def createListing(request):
    if request.method == "POST":
        filled_form = CreateListing(request.POST, request.FILES)
        if filled_form.is_valid():
            user = User.objects.get(username=request.user)
            
            new_listing = filled_form.save(commit=False)
            new_listing.listed_by = user
            new_listing.save()
            return HttpResponseRedirect(reverse("index"))
        else:
            context = {
        "createlistingform": filled_form
    }    
    else:
        context = {
            "createlistingform": CreateListing()
        }

    return render(request, "auctions/createlisting.html", context)

  

Я попытался повторить подход в разделе «Передача загрузок с файлом», и он все еще не работает.

В моей AuctionListing модели models.py есть это поле:

 image = models.ImageField(blank=True, upload_to="images/")
  

и мой файл проекта settings.py имеет такую конфигурацию:

 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

  

Является ли моя commit=False проблема в views.py создании проблемы?

Комментарии:

1. Я вижу, я позаботился о том, чтобы заполнить свое listed_by поле User моделью в ‘views.py » и вы предполагаете , что я должен сделать то же самое для своей image области , поскольку у меня есть опция » поле blank=True » ?

Ответ №1:

По ссылке, которой вы поделились,

Обратите внимание на этот запрос.ФАЙЛЫ будут содержать данные только в том случае, если метод запроса был POST, по крайней мере, одно поле файла было фактически опубликовано, а отправленный запрос имеет атрибут enctype=»multipart/ form-data». В противном случае запрос.ФАЙЛЫ будут пустыми.

Также используйте commit = False, когда вы получаете большую часть данных вашей модели из формы, но вам нужно заполнить некоторые поля null= False данными, не относящимися к форме.

Комментарии:

1. По-видимому, у my request.FILES нет ключей, поэтому нет способа вручную заполнить image поле.

2. Выполнена составная часть / часть данных формы?

Ответ №2:

Понял, в моей форме createlisting.html отсутствовал тип кодировки.

 <form enctype="multipart/form-data" action="{% url 'createlisting' %}" method="post">
    {% csrf_token %}
    {{ createlistingform }}
    <input type="submit">
</form>

  

Это устранило проблему!