Django проблема с foreginKey в шаблонах - PullRequest
0 голосов
/ 29 мая 2020

Я начал изучать Django, и у меня есть вопрос. У меня есть такой код:

from django.db import models
from django.utils import timezone

class Worker(models.Model):
    firstname = models.CharField(max_length = 32, blank=False, null=False)
    lastname = models.CharField(max_length = 32, blank=False, null=False)

class Computer(models.Model):
    TYPE = {
        (0, 'PC'),
        (1, 'Laptop'),
    }
    workerId = models.ForeignKey(Worker, on_delete=models.SET_NULL, blank=True, null=True)
    prod = models.CharField(max_length = 32, blank=False, null=False)
    type = models.PositiveSmallIntegerField(default=0, choices=TYPE)

Что мне делать в представлениях и шаблонах, если я хочу сделать список с рабочими и их компьютерами? Один компьютер может быть для одного пользователя или только для одного, но у одного работника может быть несколько компьютеров.

Мой шаблон для этого выглядит так:

{% block site %}
    {% for work in worker %}
        <p>{{ work.id }} {{ work.fullname }} 
            {{ work.lastname }}</p><br>
            {% if comp.workerId == work.id%}
                {{ comp }}
            {% else %}
                <p>Empty</p>
            {% endif %}
    {% endfor %}
    {% for c in comp %}
        <p>{{ c }}</p>
    {% endfor %}
{% endblock %}

Но у меня всегда "Пусто". Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете попробовать это с помощью for-empty в шаблоне:

{% for work in worker %}
    <p>{{ work.id }} {{ work.fullname }} 
        {{ work.lastname }}</p><br>
        {% for comp in work.computer_set.all %}
            {{ comp }}
        {% empty %}
            <p>Empty</p>
        {% endfor %}
 {% endfor %}
0 голосов
/ 29 мая 2020

Я уже объяснял это раньше в двух вопросах: здесь и здесь .

По сути, объект ForiegnKey является ключевым, потому что он уникален для класса, владеющего им. Это означает, что на вашем компьютере есть только один рабочий, ОБЯЗАТЕЛЬНО НАЗЫВАЙТЕ ЭТО РАБОЧИЙ, НЕ РАБОЧИЙ, так как это OOP и когда вы обращаетесь к mycomputer.worker, у вас есть объект Worker, который имеет .id и .pk, поэтому нет смысла называть его workerId.

Теперь каждый рабочий имеет .computer_qs, который вы можете изменить вот так

workerId = models.ForeignKey(Worker,
                             on_delete=models.SET_NULL,
                             blank=True, null=True, related_name="computers")

не забудьте называть его worker. теперь это .computers вместо .computer_qs.

В ваших шаблонах повторяйте workerObj.computers.all, чтобы получить доступ к объектам одного компьютера и получайте удовольствие!

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