Как происходит доступ к файлу из 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>