Поле Django «многие ко многим» в шаблоне и через - PullRequest
0 голосов
/ 25 августа 2018

В моих моделях есть несколько много полей.Я изо всех сил пытался заставить их появиться в шаблоне.Одно из них - обычное поле ManyToMany, другое - через.Проблема в том, что сумма не отображается.Я понимаю, что в настоящее время итерация определена только для component в pcbuilds.components.all.Как там управлять суммой?

models.py:

class Component(models.Model):
    name = models.CharField(max_length=100, unique=True,help_text='Component name')
    manufacturer = models.IntegerField(blank=True,null=True,choices=MANUFACTURERS)
    model = models.CharField(max_length=100,unique=True,blank=True,null=True, help_text='model')

class Tag(models.Model):
title = models.CharField(max_length=100,unique=True,blank=True,null=True, help_text='tagname')


class PCBuilds(models.Model):
    title = models.CharField(max_length=50, help_text='PC build title')
    components = models.ManyToManyField(Component,help_text='Pick your components from the list or create and add them.',through='Componentlist')
    subtitle = models.CharField(blank=True,max_length=80, help_text='Subtitle')

def __str__(self):
    return self.title

class Componentlist(models.Model):
    component = models.ForeignKey(Component, on_delete=models.CASCADE,related_name='components')
    pcbuild = models.ForeignKey(PCBuilds, on_delete=models.CASCADE,related_name='pcbuilds')
    amount = models.FloatField(null=True,help_text='amount')

шаблон:

<div class="card-deck">
    {% for pcbuilds in object_list|slice:":3" %}
        <div class="card" style="width: 18rem;">
            <div class="card-header">
                <a href="{% url 'pcbuilds_detail' pcbuilds.pk %}">
                <span class="font-weight-bold">{{ pcbuilds.title }}</span></a> &middot;
                <span class="text-muted">{{ pcbuilds.subtitle }}</span>
            </div>
            <div class="card-body">
            <ul>
            {% for component in pcbuilds.components.all %}
                   <li>{{ component.name}}{{ component.manufacturer}}{{ component.model }}{{ componentlist.amount }}</li>
            {% endfor %}
            </ul>
            </div>
            <div class="card-footer text-center text-muted">
            {% for tag in recipe.tags.all %}
            Tags: {{ tag.title }}
            {% endfor %}
            </div>
        </div>

        <br />
{% endfor %}

1 Ответ

0 голосов
/ 25 августа 2018

Вы не определяете componentlist там, поэтому шаблон будет игнорировать его.Обычно вам нужно следовать отношениям, как вы это сделали, чтобы получить компонент в первую очередь.Но в этом случае нет доступа к сквозной таблице, так как вы уже успешно прошли ее, чтобы получить целевую таблицу.

Вместо этого вам нужно проследить отношение от pcbuild к сквозной таблице и оттудак компоненту:

 {% for componentlist in pcbuilds.pcbuilds.all %}
           <li>{{ componentlist.component.name}}{{ componentlist.component.manufacturer}}{{ componentlist.component.model }}{{ componentlist.amount }}</li>
  {% endfor %}

Обратите внимание, что ваши связанные имена в этой сквозной таблице странные, поэтому мне пришлось использовать это запутанное pcbuilds.pcbuilds.all.Обратное отношение между pcbuild и componentlist должно быть componentlist_set, что является значением по умолчанию;не должно быть никаких причин, чтобы изменить это.

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