Информация о модели не отображается на HTML-странице Django
Я пытаюсь создать образовательный сайт с помощью Django, и когда я пытаюсь отобразить {{ profile.institution }} или {{ profile.grade }} или {{ profile.user.username }}, они не отображаются. Я не знаю, почему они не отображаются. Может ли кто-нибудь помочь мне решить эту проблему?
Мой models.py:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
institution = models.CharField(max_length = 100)
grade = models.CharField(max_length=100, choices= YEAR_IN_SCHOOL_CHOICES)
bio = models.TextField(max_length=300)
def __str__(self):
return f'{self.user.username} Profile'
Мой views.py:
class User_Profile(LoginRequiredMixin, ListView):
model = Profile
template_name = 'class/profile.html'
context_object_name = 'profile'
def get_queryset(self):
return Profile.objects.filter(user=self.request.user)
Мой html:
{% extends "class/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<br>
<div class="row d-flex justify-content-center">
<h1 style="color: #f5a425">Hello {{ user.username }}</h1>
</div>
<div class="container mt-5">
<div class="row d-flex justify-content-center">
<div class="col-md-7">
<div class="card p-3 py-4">
<div class="text-center">
<i class='fas fa-user-alt' style='font-size:36px'></i>
<!-- <img src="" width="100" class="rounded-circle"> -->
</div>
<div class="text-center mt-3">
<span class="bg-secondary p-1 px-4 rounded text-white">Pro</span>
<h5 class="mt-2 mb-0">{{ profile.user.username }}</h5>
<span>{{ profile.institution }}</span>
<span>{{ profile.grade }} Grade</span>
<div class="px-4 mt-1">
<p class="fonts">{{ profile.bio }}</p>
</div>
<div class="buttons">
<button class="btn btn-outline-primary px-4">Message</button>
<button class="btn btn-primary px-4 ms-3">Contact</button>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
какую часть кода нужно изменить, чтобы это заработало?
ListView
речь идет о множестве объектов муравьиной итерации через object_list
. В этом случае ответ @PouyaEsmaeili правильный.
Но. Ошибка в том, что у вас неправильное представление. Правильный выбор - DetailView. Оно возвращает всегда один объект или ничего.
Profile.objects.filter(user=self.request.user)
В вашем случае:
class User_Profile(LoginRequiredMixin, DetailView):
model = Profile
template_name = 'class/profile.html'
context_object_name = 'profile'
def get_object(self):
return get_object_or_404(self.model, user=self.request.user)
Если вы задали имя для шаблона profile_detail.html
, вам не нужен атрибут template_name
. Он будет найден автоматически.
Если вы не изменяете model_name
в Profile._meta - , вам не нужен атрибут context_object_name
. Он должен быть определен автоматически.
Пожалуйста, не забывайте о лучших практиках именования Django-views.
Последней версией вашего представления может быть:
class ProfileDetailView(LoginRequiredMixin, DetailView):
model = Profile
def get_object(self):
return get_object_or_404(self.model, user=self.request.user)