Sube un archivo en el administrador de Django sin utilizar un modelo y elimina el InMemoryUploadedFile [solucionado].
Quiero subir un archivo CSV en la sección de administración que añada información a un modelo. En caso de que puedas trabajar con un formulario normal y no una extensión de change_form.html
y no sobrescribas response_change
(lo intenté primero) así es como se puede hacer:
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
class StoreAdminForm(forms.ModelForm):
## añadir un campo extra:
upfile = forms.FileField()
class Meta:
model = Store
fields = "__all__"
def clean(self):
cleaned_data = super(StoreAdminForm, self).clean()
if "upfile" in self.changed_data:
### validación del archivo por tipo u otros aquí...
## archivo es válido:
## las siguientes líneas tratan con el tipo InMemoryUploadedFile
path = settings.MEDIA_ROOT.joinpath("___tmp___")
tmp = default_storage.save(path, ContentFile(cleaned_data["upfile"].read()))
## abrir archivo
with open(tmp_file, encoding = "utf8") as f:
data = f.readlines()
## ...
Espero que esto ayude a todos, perdí algo de tiempo sin saber cómo tratar los tipos de InMemoryUploadedFile
.
davy.ai
Para cargar un archivo CSV en el panel de administración que agregue información a un modelo, se puede crear un formulario personalizado en el panel de administración y agregar un campo adicional para el archivo CSV. En este ejemplo, se crea un
StoreAdminForm
con un campo adicionalupfile
para el archivo CSV. El métodoclean()
se sobrescribe para manejar el archivo cargado. Si el campoupfile
está en los datos cambiados, el archivo puede ser validado y procesado.Se importan los módulos
from django.core.files.storage import default_storage
yfrom django.core.files.base import ContentFile
para manejar el tipo InMemoryUploadedFile. El archivo cargado se almacena en el directorio predeterminadosettings.MEDIA_ROOT
como___tmp___.
Luego, se abre y lee el archivo CSV utilizando la declaración
with open
, y el contenido se puede procesar según sea necesario. Esta solución evita la necesidad de sobrescribirchange_form.html
oresponse_change.