#django #django-models #django-admin
#джанго #джанго-модели #джанго-администратор
Вопрос:
У меня есть проект django 3.x, в котором я могу загружать несколько файлов и связанные с ними данные формы через страницы администратора в модель под названием Документ. Однако мне нужно загрузить большое количество файлов, поэтому я написал небольшой скрипт на python, чтобы автоматизировать этот процесс.
У меня есть одна проблема со сценарием. Кажется, я не могу установить имя файла так, как оно задано при загрузке через страницу администратора.
Вот сценарий…У меня было несколько проблем с правильной работой токена csrf, поэтому для этого может быть какой-то избыточный код.
import requests # Set up the urls to login to the admin pages and access the correct add page URL1='http://localhost:8000/admin/' URL2='http://localhost:8000/admin/login/?next=/admin/' URL3 = 'http://localhost:8090/admin/memorabilia/document/add/' USER='admin' PASSWORD='xxxxxxxxxxxxx' client = requests.session() # Retrieve the CSRF token first client.get(URL1) # sets the cookie csrftoken = client.cookies['csrftoken'] print("csrftoken1=%s" % csrftoken) login_data = dict(username=USER, password=PASSWORD, csrfmiddlewaretoken=csrftoken) r = client.post(URL2, data=login_data, headers={"Referer": "foo"}) r = client.get(URL3) csrftoken = client.cookies['csrftoken'] print("csrftoken2=%s" % csrftoken) cookies = dict(csrftoken= csrftoken) headers = {'X-CSRFToken': csrftoken} file_path = "/media/mark/ea00fd8e-4330-4d76-81d8-8fe7dde2cb95/2017/Memorable/20047/Still Images/Photos/20047_Phillips_Photo_052_002.jpg" data = { "csrfmiddlewaretoken": csrftoken, "documentType_id": '1', "rotation" : '0', "TBD": '350', "Title": "A test title", "Period": "353", "Source Folder": '258', "Decade": "168", "Location": "352", "Photo Type": "354", } file_data = None with open(file_path ,'rb') as fr: file_data = fr.read() # storage_file_name is the name of the FileField in the Document model. #response_1 = requests.post(url=URL3, data=data, files={'storage_file_name': file_data,}, cookies=cookies) response_2 = client.post(url=URL3, data=data, files={'storage_file_name': file_data, 'name': "20047_Phillips_Photo_052_002.jpg"}, cookies=cookies,)
Когда я загружаю файл с помощью страницы администратора, имя файла «20047_Phillips_Photo_052_002.jpg», как и должно быть (т. е. storage_file_name.name = 20047_Phillips_Photo_052_002.jpg).
Когда я запускаю скрипт с помощью files={'storage_file_name': file_data,}
(см. response_1 в нижней части сценария), файлы загружаются правильно, за исключением того, что имя файла «имя_файла хранилища», а не «20047_Phillips_Photo_052_002.jpg» (т. е. storage_file_name.name = «имя файла хранилища»).
Когда я загружаю, используя files={'storage_file_name': file_data, 'name': "20047_Phillips_Photo_052_002.jpg"}
имя файла, все еще «имя файла хранилища» (т. Е. storage_file_name.name = «имя файла хранилища»).
Я заглянул в запрос.Объект FILES при загрузке файла через страницу администратора, и поле _name для каждого объекта-это имя загружаемого файла. В документации к файловому объекту django говорится, что у него есть поле под названием name
.
Чего мне не хватает, чтобы мой скрипт загружал файл так же, как это делает страница администратора? Под этим я подразумеваю, что имя файла не является «именем файла хранилища».
Ответ №1:
Когда я изменю последнее response= line
на
response = client.post(url=URL3, data=metadata, files= {'storage_file_name': open(file_path ,'rb'),}, cookies=cookies, headers=headers)
загрузка файла работает, и имя файла отображается правильно.