#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 «. На самом деле он сохраняет его как «поддельный путь» вместо фактического пути.