Папка «Media» не создается с помощью FileSystemStorage Django. Файлы также не сохраняются, если они сделаны вручную

#python #django #ajax #pycharm #file-system-storage

#питон #джанго #аякс #pycharm #файловая система-хранилище

Вопрос:

Итак, я всегда тестирую новые вещи в отдельном проекте, и пример, который я использовал для проверки этого, сработал. Однако попытка интегрировать то же самое в мой проект не дает мне нужных результатов. Сейчас я потратил на это около 4 часов, и пока ничего.

Во-первых, вот код:

index.html

 <form id="data" enctype="multipart/form-data">
<div class="col-md-4">
 <label class="file">
 <input type="file" id="file1" name="document" multiple>
 <span class="file-custom">Documents</span>
 <button type="button" onclick="enterdata()">Submit</button>
</div>
</form>
 
<script>
function enterdata(){
 if ($"data")[0].checkValidity(){
  alert('validity success');
  var token = ''{{ csrf_token }};
  alert('csrf generated');
  $.ajax({
     type:'POST',
     url:'/user',
     data: {
      doc1:$('file1').val()
   },
   header: {'X-CSRFToken': token},
   success: function(){
     alert("Added");
     $('#data').trigger("reset");
   }
  })
}else{
  $('data')[0].reportValidity()
  }
}
</script>
 

views.py

 def testing_data(request):
 if request.method == 'POST':
 doc11 = request.POST['doc1']
 
 request_file = request.FILES['document'] if 'document' in request.FILES else None
        if request_file:
            # save attatched file
            # create a new instance of FileSystemStorage
            fs = FileSystemStorage()
            file = fs.save(request_file.name, request_file)
            # the fileurl variable now contains the url to the file. This can be used to serve the file when needed.
            fileurl = fs.url(file)
 landform.objects.create
 (
   mutdoc=doc11,
 )
return HttpResponse('')
 

models.py

 class landform(models.Model):
 mutdoc = models.CharField(max_length=255)
 

urls.py

 urlpatterns = [
  path('user', testing_data),
 ]
if settings.DEBUG:
    urlpatterns  = static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
 

settings.py

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

Итак, текущий код берет путь и помещает его в поле mutdoc в моей модели, это нормально, и у меня есть много других полей, которые я опустил в приведенном выше коде. Но помимо всего этого, код, который получает файл и сохраняет его в каталоге мультимедиа, работает нормально, когда я запускаю его независимо в другом проекте (без Ajax). Но в моем проекте, когда я объединяю его в этом представлении выше и Ajax, все остальное работает так, как ожидалось, кроме того, что Django создает папку мультимедиа и помещает в нее выбранный файл.

Просмотрел множество других тем SO, сообщений в блогах и видео, но все еще не может заставить его работать.

Оригинал

HTML

 
<form method = 'POST' class="col s12" enctype="multipart/form-data">

        {% csrf_token %}

        {{new_form.as_p}}

    <!--Below is our main file upload input -->
        <input type = "file" name = 'document'>
        <p><button type = "submit" class = "waves-effect waves-light btn">Publish</button></p>
</form>
 

views.py

 from django.shortcuts import render
from django.core.files.storage import FileSystemStorage

def loadpage(request):
    if request.method == "POST":
        # if the post request has a file under the input name 'document', then save the file.
        request_file = request.FILES['document'] if 'document' in request.FILES else None
        if request_file:
            # save attatched file

            # create a new instance of FileSystemStorage
            fs = FileSystemStorage()
            file = fs.save(request_file.name, request_file)
            # the fileurl variable now contains the url to the file. This can be used to serve the file when needed.
            fileurl = fs.url(file)

    return render(request, "template.html")
 

urls.py

 urlpatterns = [
    path('admin/', admin.site.urls),
    path('', loadpage)
]
# only in development
if settings.DEBUG:
    urlpatterns  = static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
 

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

1. Ajax выдал вам какое-либо сообщение об ошибке?

2. @ha-neul Нет. Ajax работает нормально, и все 30 полей успешно вставляются в базу данных. Вот журнал из PyCharm: [01 / Dec / 2020 19:53:14] «GET / test HTTP / 1.1» 200 17941 [01 / Dec / 2020 19:54:12] «POST / user HTTP / 1.1» 200 0

3. привет, почему вы не используете файловую форму? похоже, что в файле нет модели, связанной с ним, Как вы собираетесь ссылаться на этот файл в шаблоне позже? Есть ли у вашего способа, отличного от ajax, модель и форма, связанные с файлом?

4. @ha-neul извините, я не знаю об этом методе. Я использую FileSystemStorage Django в двух приведенных выше примерах (я обновил сообщение оригинальным проектом, в котором он работает, вы можете это проверить), но проблема в том, что если все остальное в порядке, почему это должно работать на одном, а не на другом? Что касается формы файла, я взгляну на нее и посмотрю, смогу ли я заставить ее работать. Спасибо.

Ответ №1:

1. заменить:

 urlpatterns = [
  path('user', testing_data),
 ]
 

с

 urlpatterns = [
  path('user/', views.testing_data, name='testing_data'),
]
 

2. Это может быть проблемой. Попробуй это:

заменить:

 <input type="file" id="file1" name="document" multiple>
 

с:

 <input type="file" id="file1" name="document" >
 

Я не смог найти документ о том, заставит ли наличие multiple inside of <input> вас использовать request.FILES.getlist('document')
вместо того , чтобы
request.FILES['document'] или нет, но попробовать стоит.

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

1. Это моя вина, я написал этот код в посте выше и забыл добавить #. Это действительно есть в проекте. Это просто сохраняет путь в базе данных следующим образом: «C:fakepathfilename.ext «. На самом деле он сохраняет его как «поддельный путь» вместо фактического пути.