#django #django-models #django-views #django-forms #django-templates
Вопрос:
Этот код возвращает ошибку типа, как и ожидалось, str, байты или ос.Объект, похожий на путь, а не в загруженном файле. Я не знаю, как передать пользовательские данные в виде файла и изображения в мой code.py файл для внесения изменений в оригинал.
views.py
def home(request):
new_image = None
file = None
form = ScanForm()
if request.method == 'POST':
form = ScanForm(request.POST, request.FILES)
if form.is_valid():
image = request.FILES['image']
xml_file = request.FILES['xml_file']
new_image = code.create(image, code.search(
xml_file)[0], code.search(xml_file)[1])
form.save()
return render(request, 'app/home.html', {'form': form, 'new_image': new_image})
else:
form = ScanForm()
return render(request, 'app/home.html', {'form': form, 'new_image': new_image})
печать изображения и xml_file успешно распечатывают их имена
forms.py
class ScanForm(forms.ModelForm):
class Meta:
model = Scan
fields = '__all__'
models.py
class Scan(models.Model):
image = models.ImageField(upload_to='images')
xml_file = models.FileField(upload_to='files')
processed_at = models.DateTimeField(auto_now_add=True)
description = models.CharField(max_length=500, null=True)
class Meta:
ordering = ['-processed_at']
def __str__(self):
return self.description
Вот код для манипулирования изображением в соответствии с данными в xml
code.py
def search(path):
new = []
object_names = []
object_values = []
txt = Path(path).read_text()
txt.strip()
names = et.fromstring(txt).findall('object')
for i in names:
object_names.append(i[0].text)
values = et.fromstring(txt).findall('object/bndbox')
for i in values:
for j in i:
object_values.append(int(j.text))
return object_names, object_values
def create(image, object_names, object_values):
img = cv.imread(image)
on = len(object_names)
ov = len(object_values)
for i in list(range(0, ov, on)):
cv.rectangle(img, (object_values[i], object_values[i 1]),
(object_values[i 2], object_values[i 3]), (0, 0, 255), thickness=5)
return img
Это code.py работает нормально, если протестировано путем передачи данных вручную с помощью локальной папки.
Вот обратная связь:
Комментарии:
1. Можете ли вы поделиться всей обратной связью?
2. Я добавил изображение обратной связи
3. Попробуйте в следующий раз поместить обратную связь в виде текста 🙂 Судя по этому,
search
принимает путь, но вы передаете файл, который все еще находится в памяти. Я не уверен, чтоsearch
именно делаю иcreate
делаю, поэтому я не могу дать совет, но вам нужно либо сначала сохранить файл и получить путь, либо изменитьsearch
, чтобы использовать файл в памяти вместо пути4. предположим, у меня есть
image
в моейdatabase
, и я хочу изменить его, используяpillow
, но только изображение у меняselected
из базы данных как бы я установить изображение в путьpillow
, он попытался дать образ.URL-адреса и передает изображение, но это не сработало для меня, и я не знаю других способов сделать это. Также я попытался использовать localhost:80000 URL-адрес изображения5. Не совсем уверен, может быть, обновите свои теги и добавьте
pillow
, чтобы люди, которые использовали pillow, могли дать вам идеи
Ответ №1:
pathlib.Path()
обрабатывает пути к файлам, а не объекты памяти. request.FILES
являются данными, приложенными к почтовому запросу. Во время обработки запроса POST вы можете проверить эти данные и принять решение сохранить их на диске сервера.
Если вы хотите, чтобы ваша обработка изображений считывала файл с диска сервера, сначала вам необходимо сохранить экземпляр новой модели. Затем вы можете получить доступ к пути к файлу на диске через name
атрибут поля изображения модели, см. раздел Использование файлов в моделях.
Если вы хотите обработать загруженные данные перед сохранением их на диск, вы можете прочитать их следующим образом:
txt = request.FILES["xml_file"].read()
Смотрите Загруженный файл.прочитайте()