Django html отображение из модели

Мне нужно на моей html странице отобразить данные из модели Profesor и Ucenik: ime, prezime, jmbg.

{{profesor.ime}}
{{profesor.prezime}}
{{ucenik.ime}}
{{ucenik.prezime}}
{{ucenik.jmbg}}

страница моего профиля id динамическая, нужно отображать данные профессора или если ucenik, то отображать данные ucenik

что мне нужно добавить в мой views.py

models.py

class Profesor(models.Model):
   user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
   ime = models.CharField(max_length=200, null=True)
   prezime = models.CharField(max_length=200, null=True)
 
class Ucenik(models.Model):
   user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
   ime = models.CharField(max_length=200, null=True)
   prezime = models.CharField(max_length=200, null=True)
   jmbg = models.IntegerField(null=True)

urls.py

path('profesor/', views.profesor, name='profesor'),
path('ucenik/', views.ucenik, name='ucenik'),
path('posetioc/', views.posetioc, name='posetioc'),
path('profil/<str:pk>/', views.profil, name='profil'), ]

views.py

def profesor(request):

   return render(request, 'pocetna_profesor.html')


def ucenik(request):

   return render(request, 'pocetna_ucenik.html')


def profil(request, pk):

   return render(request, 'profil.html')

HTML:

{% extends 'base.html' %}
<title>profesor</title>

{% block content %}

<body>
{% include 'navbar.html' %}
   <h1>Ime:</h1>
   {{profesor.ime}}
</body>

{% endblock %}

Вам нужно добавить экземпляр Professor и Ucenik в контекст представления.

context = {
    'professor': Professor.objects.get(),
    'ucenik': Ucenik.objects.get()
}
return render(request, context, 'url.html')

Вы можете сделать представление вашего профиля динамичным, введя дополнительный параметр, определяющий вашу роль (например, профессор/Ученик)

/profil/profesor/2/ для профессора /profil/ucenik/1 для ucenik

from django.urls import path

urlpatterns=[
    path('profil/<str:role>/<int:pk>/', views.profil, name='profil'),
]
# views.py
from .models import Profesor,Ucenik # import your model
def profil(request,role,pk):
    context = {}
    context['role'] = type 
    if type=="profesor":
        context['person'] = Profesor.objects.get(id=pk)
    else:
        context['person'] = Ucenik.objects.get(id=pk)
    return render(request, 'profil.html',context)
<!-- profil.html -->
{% extends 'base.html' %}
<title>{{role}}</title>

{% block content %}

<body>
{% include 'navbar.html' %}

   <h1>Ime:</h1>
   {{person.ime}}
</body>

{% endblock %}

Различный подход:
Предположим, что ваша User модель имеет id или любое уникальное поле. Вы можете использовать это id в качестве идентификатора вашего профиля (т.е. url's <int:pk>). Поэтому вместо profil/profesor/3 вы можете использовать profil/3, который должен быть определенно одной из двух категорий (предполагая, что profesor и ucenik являются взаимоисключающими).

Для этого импортируйте модель User в представление вместе с другими моделями.
views.py

from django.shortcuts import render

from ..models import User # give correct path to user model
from .models import Profesor,Ucenik

def profil(request,pk):
    context={}
    person = User.objects.get(id=pk)
    
    try :
        person.profesor
        # print(dir(person))
    except Profesor.DoesNotExist:
        context['person'] = Ucenik.objects.get(id=person.ucenik.id)
    else:
        context['person'] = Profesor.objects.get(id=person.profesor.id)

    return render(request,"profil.html",context)

urls.py

from django.urls import path
from .views import profil

urlpatterns = [
    path('profil/<int:pk>/',profil) # I have used int
]

Я использовал person, нейтральное имя переменной вместо profesor или ucenik. Вы можете назвать ее как угодно, даже profil profil.html

{{person.id}}
{{person.ime}}
{{person.prezime}}

{% if role == "ucenik" %}
  {{person.jmbg}}
{% else %}
  <!-- profesor does not have jmbg -->
{% endif %}
Вернуться на верх