Python django Проблема отношений с внешними ключами - PullRequest
1 голос
/ 16 марта 2020

Я работаю над проектом онлайн-школы, где у меня есть классы, и в классах у меня разные предметы, я добавил отношение «один ко многим» (ForeignKey) между «Классами» и «Предметами», но когда приходит тема представления на странице HTML. Темы из 2.Class показываются на 1.Class одной странице (все темы отображаются в одном классе)

Как решить эту проблему ??
(Как сохранить объекты 2.Class на странице 2.Class, а также для 1.Class?)

МОЙ КОД

viws.py

def classes(request):
    classes = Class.objects
    context={
        'class':classes
    }
    return render(request, "templates/Classes.html", context)

def subjects(request, sub_id):
    classes=get_object_or_404(Class, pk=sub_id)
    subject=Subject.objects.all()
    context={
        'classes':classes,
        'subject':subject
    }
    return render(request, "templates/Subjects.html", context)

Models.py

class Class(models.Model):
    title=models.CharField(max_length=200)
    image=models.ImageField(upload_to="images")

class Subject(models.Model):
    title=models.CharField(max_length=2000)
    Class=models.ForeignKey(Class, on_delete=models.CASCADE)

Веб-страница

{%for subject in subject.all%}
<div class="cardrow">
    <div class="cardcolumn">
        <a href="#"> 
            <div class="card">
                <h1>{{subject.title}}</h1>
            </div>
        </a>
    </div>         
</div>
{%endfor%}

Итак, снова все предметы отображаются в одном классе. хотя я добавил отношение с внешним ключом

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Прежде всего у вас все они отображаются, потому что вы просто выбираете все Subjects из БД и показывает их на странице. Вам нужно отфильтровать Subjects, используя, как вариант, subject_id, вы переходите к представлению:

def subjects(request, sub_id):
    class_obj=get_object_or_404(Class, pk=sub_id)
    subject=Subject.objects.filter(Class_id=class_obj)
    context={
        'classes':class_obj,
        'subjects':subject
    }

и затем в шаблоне:

{% for subject in subjects %}

Следующая вещь этот параметр представления с именем sub_id на самом деле является идентификатором класса - лучше его переименовать.

И еще одна вещь (среди прочего) - это плохая практика, чтобы скрывать встроенные имена, как вы это делали, называя поля модели как Class. И да, это должно быть в нижнем регистре.

0 голосов
/ 16 марта 2020

Вы получаете все, потому что вы запрашиваете all содержимое Subject.

Вот как можно получить все предметы, относящиеся к классу:

subjects = class_obj.subject_set.all()

Также см. Официальную документацию: https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_one/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...