Django как получить данные из базы данных и отобразить их на отдельной странице
Я работаю над трекером активности для моего класса веб-разработки, и мы работаем с django. Я пытаюсь добавить страницу, которая показывает детали активности на отдельной странице, передавая ее id в url для отображения информации об активности, специфичной для этого объекта базы данных (подобно новостным статьям на веб-сайтах)
Я думаю, что проблема кроется в моей странице с видами. Мне нужна помощь в написании того, как правильно получить информацию из базы данных, чтобы передать ее в html-форму. Страница загружается нормально с id, прикрепленным к url, но никакой информации не отображается
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpRequest
from . models import Activity
# Create your views here.
def index(request: HttpRequest):
activites = Activity.objects.all()
return render(request, "activity/index.html", {"activites" : activites})
def new_activity(request: HttpRequest):
if request.method == 'POST':
params = request.POST
activity = Activity(
activity_name = params.get("activity_name")
)
activity.save()
return redirect("/")
return render(request, "activity/new_activity.html")
def activity(request: HttpRequest, id):
id = Activity.objects.get(id=id)
return render(request, "activity/activity.html")
Вот что у меня есть для html-страницы (при необходимости я могу переименовать передаваемые данные) activity.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>{{ activity.activity_name }}</h1>
</body>
</html>
models.py (если нужно посмотреть)
from django.db import models
from datetime import timedelta
# Create your models here.
class Activity(models.Model):
id = models.BigAutoField(primary_key=True)
activity_name = models.TextField()
def time_spent(self):
delta = timedelta()
for timelog in self.timelog_set.all():
delta += (timelog.end_time - timelog.start_time)
return str(delta)
class TimeLog(models.Model):
id = models.BigAutoField(primary_key=True)
start_time = models.TimeField()
end_time = models.TimeField()
activity = models.ForeignKey("Activity", related_name="time_logs", on_delete=models.CASCADE)
и мой urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("new_activity/", views.new_activity, name="new_activity"),
path("activity/<int:id>", views.activity, name="activity")
]
Я не могу добавить никаких дополнительных библиотек или модулей, которые не обсуждались в классе, поэтому я не могу изменить это слишком сильно. Спасибо за помощь!
Пробовал передавать различные аргументы и имена, но ничего не помогло
Вы не передали модель деятельности в представление activity.html после получения идентификатора.
вы не отправили контекст.
def activity(request: HttpRequest, id):
obj = Activity.objects.get(id=id)
return render(request, "activity/activity.html" {'activity': obj})
# activity.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>{{ activity.activity_name }}</h1>
</body>
</html>