Отображение данных из двух разных моделей в одной html-таблице с помощью Django

#python #django #django-models

Вопрос:

У меня есть две модели, а именно StudentInfo и StudentAdmission. student_id-это внешний ключ в модели приема студентов. Я хочу отобразить значения обеих моделей вместе в одной html-таблице. Как я мог это сделать?

models.py файл:

 from django.db import models
from datetime import datetime

# Create your models here.
class StudentInfo(models.Model):
    gender_choice = (
        ("male", "Male"),
        ("Female", "Female"),
    )
    
    firstname = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    gender = models.CharField(choices=gender_choice, max_length=10)
    dob = models.DateField(default=datetime.now, blank=True)
    address = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    phone = models.CharField(max_length=100)
    photo = models.ImageField(upload_to='photos/%Y/%m/%d/')

    def __str__(self):
        return self.firstname

class StudentAdmission(models.Model):
    class_choice = (
        ("one", "one"),
        ("two", "two"),
        ("three", "three"),
    )
    
    section_choice = (
        ("A", "A"),
        ("B", "B"),
        ("C", "C"),
    )
    
    transport_choice1 = (
        ("abc", "abc"),
        ("bcd", "bcd"),
        ("def", "def"),
    )

    transport_choice2 = (
        ("ab", "ab"),
        ("bc", "bc"),
        ("de", "de"),
    )
    
    admission_no = models.CharField(max_length=100)
    admission_date = models.DateField(default=datetime.now, blank=True)
    roll_no = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=100)
    class_name = models.CharField(choices=class_choice, max_length=10)
    section_name = models.CharField(choices=section_choice, max_length=10)
    transportation = models.CharField(choices=transport_choice1, max_length=10)
    transport_vehicle = models.CharField(choices=transport_choice2, max_length=10)
    student_name = models.ForeignKey(StudentInfo, on_delete=models.CASCADE)

    def __str__(self):
        return self.username
 

view.py:

 def student_list(request):
    students = StudentInfo.objects.all().order_by('-id')
    data = {
        "students": students,
    }
    return render(request, "students/student_list.html", data)
 

student_list.html

 {% if students %}
    {% for student in students %}
        <tr>
            <td>
              #0021
            </td>
            <td class="text-center">
                {% if student.photo %}
                    <img src="{{ student.photo.url }}" alt="student">
                {% else %}
                    <img src="{% static 'img/default-pic.png' %}" alt="student">
                {% endif %}
            </td>
            <td>{{student.firstname}}</td>
            <td>{{student.gender}}</td>
            <td>class name</td>
            <td>section name</td>
            <td>Jack Sparrow </td>
            <td>{{student.address}}</td>
            <td>{{student.dob}}</td>
            <td>{{student.phone}}</td>
            <td>{{student.email}}</td>
            
        </tr>
    {% endfor %}
{% endif %}
 

Я хочу отобразить связанные имена классов и разделов в следующей таблице

Комментарии:

1. добавьте свой вид или шаблон, покажите, что вы пробовали

2. @Blackranger Я добавил представление и шаблон, пожалуйста, проверьте это.

Ответ №1:

Вы можете получить доступ к связанному объекту через RELATED_MODEL_NAME_set . Вот, например, это studentadmission_set

Или вы можете указать свое собственное имя, связанное с models.py :

 class StudentAdmission(models.Model):
    ...
    student_name = models.ForeignKey(StudentInfo, on_delete=models.CASCADE, related_name="admissions")
 

После этого вы сможете получить доступ к связанной модели с этим значением

 ...
{% for admission in student.admissions.all %}
... Do sth
{% endfor %}
...
 

Комментарии:

1. Теперь я получаю следующую ошибку: объект ‘RelatedManager’ не может быть повторен

2. Прости! я отредактировал свой ответ. Обратите внимание, что у каждого студента есть несколько допусков, поэтому позаботьтесь о том, как вы хотите показать их в таблице @Rafiullah

3. Рад это слышать @Rafiullah