Не удается получить связанные поля в ForeignKeys для отображения в шаблоне - PullRequest
1 голос
/ 23 мая 2019

Я работаю в Django 2.2, пытаясь построить представление для базы данных, которая собирает все для конкретной компании (местоположения всех их магазинов и заметки о компаниях) в одно представление.Я пробовал методы в нескольких разных ответах, но все еще не могу получить данные из соответствующих внешних ключей для отображения в шаблоне.

models.py

class Company(models.Model):
    name = models.CharField(max_length=30, primary_key=True)
    official_name = models.CharField(max_length=50)
    corporate_address1 = models.CharField(max_length=50)
    corporate_address2 = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.ForeignKey('Country', on_delete=models.CASCADE)
    slug = models.SlugField(max_length=30, unique=True)

    def __str__(self):
        return self.name

class Stores(models.Model):
    store_name = models.CharField(max_length=30, primary_key=True)
    owner = models.ForeignKey('Company', on_delete=models.CASCADE)
    store_address1 = models.CharField(max_length=50)
    store_address2 = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.ForeignKey('Country', on_delete=models.CASCADE)
    type = models.CharField(max_length=30,choices=store_types)
    slug = models.SlugField(max_length=30, unique=True)

    def get_absolute_url(self):
        return reverse("store-detail", kwargs={"slug": self.slug})

class notes(models.Model):
    title   = models.CharField(max_length=120)
    content = models.TextField()
    posted = models.DateTimeField(db_index=True, auto_now_add=True)
    category = models.ForeignKey('Company', on_delete=models.CASCADE)
    active  = models.BooleanField(default=True)

    def get_absolute_url(self):
        return reverse("article-detail", kwargs={"id": self.id})

class Country(models.Model):
    country = models.CharField(max_length=30,choices=countries,primary_key=True)

    class Meta:
        ordering = ["-country"]
        db_table = 'country'

    def __str__(self):
        return self.country

views.py

class CompanyOverView(LoginRequiredMixin, DetailView):
    model = Company
    template_name = "company-overview.html"
    slug_url_kwarg = 'slug'
    query_pk_and_slug = True
    pk_url_kwarg = "company.name"

template

<div align="center">
<p>{{ object.name }}<br>({{ object.official_name }})</p>
<p>{{ object.corporate_address1 }}<br>{{ object.corporate_address2 }}<br>
   {{ object.city }}<br>{{ object.state_province }}<br>
   {{ object.country }}</p>
</div>
<p>List of Stores</p>
<p>
{% for instance in object_list %}
    {{ instance.company.stores.store_name }}
    {{ instance.company.stores.store_address1 }}
    {{ instance.company.stores.store_address2 }}
    {{ instance.company.stores.city }}
    {{ instance.company.stores.state_province }}
    {{ instance.company.stores.country }}
{% endfor %}
</p>
<p>Notes</p>
<p>
{% for instance in object_list %}
    {{ instance.company.notes.title }}
    {{ instance.company.notes.posted }}
{% endfor %}
</p>

При использовании приведенного выше кода единственное, что появляетсяпри вводе в названии компании все находится вверху (например, «object.name» появляется на странице как «Acme Corporation»).Ничего в цикле for не появляется на веб-странице.

При просмотре документации, object_list является именем по умолчанию для контекста, если не указано иное.Я пробовал разные комбинации, такие как «для store_name в company.store_set.all» и другие комбинации, которые я нашел в других постах, но ни одна из них не сработала.Я прочесал документацию для всего, что связано с внешними ключами, но не могу найти решение, которое работает.

Заранее спасибо, если можете помочь.

1 Ответ

0 голосов
/ 23 мая 2019

Нет.object_list - это имя контекста по умолчанию в ListView.Но у вас есть DetailView, и вы уже знаете, какое имя контекста по умолчанию для них, потому что вы уже используете его: object.Вам просто нужно перебрать обратное соотношение оттуда:

{% for store in object.stores_set.all %}
    {{ store.store_name }}
    {{ store.store_address1 }}
    ...
{% endfor %}
...