Как происходит доступ к файлу из FileField модели OneToOne, чтение в views.py и передача в шаблон?

Я разрабатываю простое приложение для визуализации данных, где пользователь может зарегистрироваться, войти в систему, загрузить файл и визуализировать его содержимое.

Я использую модель по умолчанию User, и модель Detail, имеющую отношение OneToOne с моделью User. Модель Detail имеет 3 поля, а именно:

OneToOne(User)
FileField()
TextField()

Теперь я хочу получить доступ к файлу, сохраненному в FileField, in views.pyand read it's content, then visualize it using Python'sNumPyandMatplotlib`, а затем показать результаты визуализации на фронтенде.

Мне нужно руководство, как я должен начать и подойти к этой задаче? В принципе, мне нужно глубокое руководство, как получить доступ и прочитать файл в views.py?

Мой models.py - это:

class Detail(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    file = models.FileField(verbose_name="CSV File", upload_to='csv_files/')
    file_desc = models.TextField("CSV File Description")

    def __str__(self):
        return ("{} ({} {})".format(self.user.email, self.user.first_name, self.user.last_name))

а в views.py я подхожу к этому так:

class VisualizeAPI(View):
    template_name = 'accounts/visualize.html'

    def get(self, request):
        msg = {'message': "Please login to view this page."}
        
        if request.user.is_authenticated:
            detail, _ = Detail.objects.get_or_create(user=request.user)
            context = {'detail': detail}

            return render(request, self.template_name, context)

        return render(request, self.template_name, msg)

а в template я подхожу к этому так:

<body>
    <h1>Visualized Details</h1>
 
    {% if request.user.is_authenticated %}
    {{ detail }}
    {% else %}
    <h2>{{ message }}</h2>
    {% endif %}
</body>

Но он не печатает содержимое файла на фронтенде. Буду рад за правильный подход и предоставленное руководство.

Вам нужно разобрать CSV файл в вашем представлении и затем передать его в ваш шаблон.

import csv
from io import StringIO


class VisualizeAPI(View):
    template_name = "accounts/visualize.html"

    def get(self, request):
        msg = {"message": "Please login to view this page."}

        if request.user.is_authenticated:
            detail, _ = Detail.objects.get_or_create(user=request.user)
            if detail.file:
                # Read file from detail object
                file = detail.file.read().decode("utf-8")
                # Parse file as csv
                csv_data = csv.reader(StringIO(file), delimiter=",")
            else:
                csv_data = None
            context = {
                "detail": detail,
                "csv_data": csv_data,
            }

            return render(request, self.template_name, context)

        return render(request, self.template_name, msg)

Тогда вы можете вывести каждую строку вашего csv файла в вашем шаблоне.

<body>
  <h1>Visualized Details</h1>

  {% if request.user.is_authenticated %}
  {{ detail }}
  {% for row in csv_data %}
    {{ row }}
  {% endfor %}
  {% else %}
  <h2>{{ message }}</h2>
  {% endif %}
</body>
Вернуться на верх