Django: ręcznie utwórz pole obrazu w modelu z istniejącego pliku na serwerze


To mnie zabija!
Używam Django-FileBrowser i chcesz utworzyć aplikację galerii, która korzysta z możliwości rozruchowych do zarządzania obrazami.
Mam model galerii, który pozwala użytkownikowi wybrać lub utworzyć katalog na serwerze i przesłać pliki do tego folderu, aby pojawiły się w galerii. Chcę automatycznie przeglądać katalog, do którego użytkownik przesłał obrazy, i wybrać go, a następnie automatycznie utworzyć instancję obrazów dla każdego obrazu w folderze.
class Gallery(model.Models):
gallerydirectory = FileBrowserField(...)
title = ...
description ...class Image(model.Models):
image_field = models.ImageField()

Problem polega na tym, że FileBrowser przedstawia obrazy w inny sposób niż Django, ale chcę użyć Django ImageFields, ponieważ mogę użyć innych aplikacji (Miniatury Sorl) na końcu szablonu.
Mam wszystkie dane wymagane do pliku, czyli nazwę pliku, ścieżką itp., Po prostu nie mogę zrobić Django utworzyć instancję Imagefield, w rzeczywistości bez ładowania obrazu ponownie. Chcę go tylko wypełnić.
widziałem

tutaj
https://coderoad.ru/811167/
inny wątek, który sugeruje, co następuje:
for image in filebrowser_image_objects_list:
f = File(open('path-to-file-on-server','r'))
i = Image()
i.image_field('filename.png',f.read())

ale to daje mi:
SuspiciousOperation error
Attempted access to '/filename.png' denied

co oznacza, że ​​ścieżka nie jest poprawnie odczytywana. Wydrukowałem atrybuty obiektu File i otwiera on poprawny obraz, po prostu nie jest przekazywany do ImageField
Pomoc byłaby bardzo mile widziana!

UPDATE

Odmówiłem próby uzyskania tej pracy, ponieważ jest zbyt brudny. Problem, z którym miałem na sobie, że zainstalowano, że zainstalowałem upload_field Imagefield w "/" i pozostał niezauważony, co oznaczało, że plik został nagrany w "/something.png".
Zmieniłem to tak, że teraz obraz używa również FileBrowserField zamiast ImageField.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zauważam to jako odpowiedź, ponieważ jest to właściwy sposób na to:
image_model.image_field('path', File().read())

Zapisywanie obrazu programowo w Django ImageField
https://coderoad.ru/1308386/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mogłem coś przeoczyć, ale to zadziałało:
from a1.models import Model1 
from django.core.files.images import ImageFile
m = Model1.objects.create()
m.f1 = ImageFile(open("1.png", "rb"))
m.save()

Dla następnego modelu:
class Model1(models.Model): 
f1 = models.ImageField()

Więc nie działa:
m.f1('1.png', File.read(open('1.png', 'r')))

Jest tam napisane:
TypeError: 'ImageFieldFile' object is not callable

Sprawdzone w Django 1.7, 1.11.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To działa dla mnie w Python3 z Django 2
from urllib.request import urlopen
from urllib.parse import urlparse
from io import BytesIO
from django.core.files.images import ImageFile
from .models import ModelWithImageField# Solving for SSL Error
import ssl
ssl._create_default_https_context = ssl._create_unverified_contexturl = [url=https://www.someurl.com/image.png?other_params_if_they_exist]https://www.someurl.com/image. ... exist[/url]
image_file_name = urlparse(url).path.split('/')[-1]
image_file_content = BytesIO(urlopen(url).read())
ModelWithImageField().image_field.save(image_file_name, image_file_content)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się