мои просмотры
class TestFilesView(FormView):
form_class = TestFilesForm
template_name = 'testy/xml_files_upload.html'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist('file_field')
if form.is_valid():
for f in files:
instance = TestFiles(
id_test=TestHeader(self.kwargs['id']),
name='xx',
file_name=f.name,
file_field=f
)
instance.save()
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_success_url(self):
return reverse('tests_list')
Как я могу открыть загружаемый xml-файл, получить атрибут «name» из xml-файла и переслать его в мою переменную имени istance?
Вы можете помочь мне ?





Вам следует использовать библиотеку синтаксического анализа, например Красивый суп. Вы можете попробовать что-то вроде ниже:
if form.is_valid():
for f in files:
instance = TestFiles(
id_test=TestHeader(self.kwargs['id']),
name='xx',
file_name=f.name,
file_field=f
)
instance.save()
with open(f.read(), 'r') as file:
soup = BeautifulSoup(file, 'xml.parser')
instance.name = soup.name
instance.save()
Пожалуйста, предоставьте полную обратную связь.
Хорошо, моя ошибка, просто замените with open(f, 'r') as file: на with open(f.read(), 'r') as file:. Однако у вас могут быть проблемы с функцией открытия (не подходит для xml). Если да, удалите его и просто попробуйте soup = BeautifulSoup(f.read(), 'xml.parser')
Однако из документации django позаботьтесь о размере вашего файла. UploadedFile.read () ¶ Прочитать все выгруженные данные из файла. Будьте осторожны с этим методом: если загруженный файл огромен, он может перегрузить вашу систему, если вы попытаетесь прочитать его в памяти. Вы, вероятно, захотите вместо этого использовать chunks (); см. ниже. UploadedFile.multiple_chunks (chunk_size = None) ¶ Возвращает True, если загруженный файл достаточно велик, чтобы требовать чтения несколькими фрагментами. По умолчанию это будет любой файл размером более 2,5 мегабайт, но его можно настроить; см. ниже.
когда я использую вашу иллюзию, я получаю ошибку: ожидаемый объект str, bytes или os.PathLike, а не InMemoryUploadedFile