Как я могу получить доступ к атрибуту полей MTM в моем шаблоне - PullRequest
0 голосов
/ 08 мая 2019

У меня 3 модели: пользователь, сервер и протокол. В моем шаблоне я хочу отобразить только список серверов, доступных по определенному протоколу (например, SSH) и пользователю.

models.py:

class Protocol(models.Model):

    name = models.CharField(
        verbose_name = ('Protocol name'),
        max_length = 50,
        unique = True,
        default = "Protocol",
        blank = False
    )

    port = models.IntegerField(
        verbose_name = ('Port Number'),
        default = 22,
        blank = False,
        validators=[MinValueValidator(0), MaxValueValidator(65535)]
    )


    def __str__(self):
        return self.name

class Server(models.Model):
    name = models.CharField(
        unique = True,
        verbose_name = ('Server name'),
        max_length = 50,
        default = "Server name",
        blank = False
    )

    hostname = models.CharField(
        verbose_name = ('Host name'),
        max_length = 40,
        default = "hostname",
        blank = False
    )

    ip = models.GenericIPAddressField(
        verbose_name = ('IP address'),
        protocol = 'ipv4',
        blank=False
    )

    user = models.ManyToManyField(User, related_name='User')

    protocol = models.ManyToManyField(Protocol, related_name='Protocol')

    def __str__(self):
        return self.name

view.py:

class ServerListView(LoginRequiredMixin,ListView):
    queryset = Server.objects.all()
    context_object_name = 'servers'

файл шаблона:

          {%for server in servers%}
<a><div>
<h4>{{server.name}}</h4>
<h6>Hostname: {{server.hostname}}</h6>
<h6>IP Address: {{server.ip}}</h6>
</div>
</a>
{%endfor%}

Все отлично работает. Однако я не могу отобразить протокол, связанный с каждым сервером. Я пробовал эти строки, но результат None и ничего не отображается!

{% for protocol in server.Protocol.all %}
<h1>protocol:  {{ protocol }}</h1>  
{% endfor %}

Может кто-нибудь помочь мне, пожалуйста!

1 Ответ

1 голос
/ 08 мая 2019

Попробуйте изменить

{% for protocol in server.Protocol.all %}

до

{% for protocol in server.protocol.all %}

Также обратите внимание, что если вы пытались использовать Protocol, потому что это related_name, то это на самом деле в обратном направлении, оно предназначено для использования на объектах протокола, где вы должны сделать protocol.Protocol.all, чтобы получить все серверы --- и поэтому вы можете переименовать его в servers для ясности.

...