es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 adicional upfile para el archivo CSV. El método clean() se sobrescribe para manejar el archivo cargado. Si el campo upfile 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 y from django.core.files.base import ContentFile para manejar el tipo InMemoryUploadedFile. El archivo cargado se almacena en el directorio predeterminado settings.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 sobrescribir change_form.html o response_change.

Comments are closed.