Выбрать модели Django в виде списка, чтобы показать оба - PullRequest
0 голосов
/ 06 мая 2019

У меня есть эти модели:

Статья:

class Article(models.Model):
    sku = models.CharField(
        max_length=5,
        primary_key=True,
        validators=[MinLengthValidator(5)]
    )
    ean = models.CharField(
        max_length=13,
        unique=True,
        validators=[MinLengthValidator(13)]
    )
    parent = models.ForeignKey(
        'Article',
        related_name='children',
        null=True,
        blank=True,
        on_delete=models.PROTECT
    )
...

и ArticleTranslations:

class ArticleTranslation(models.Model):
    LANGUAGE_CHOICES = (
        (settings.ENGLISH, _("english")),
        (settings.FRENCH, _("french")),
        (settings.GERMAN, _("german")),
        (settings.ITALIAN, _("italian")),
        (settings.PORTUGUESE, _("portuguese")),
        (settings.SPANISH, _("spanish")),
    )
    article = models.ForeignKey(
        'Article',
        on_delete=models.CASCADE,
        related_name='translations',
    )

Мне нужно вернуть оба вместе, чтобы показать 2 элемента в HTML-шаблоне Django. Нужно иметь элемент и внешний ключ и видеть его в тех же итерациях. Я хочу сделать это с помощью методов класса List View и Django, а не делать что-то плохое. У меня есть этот ListView:

    def get_queryset(self):
        queryset = (Article.objects
                    .all()
                    .prefetch_related('translations')
                    .order_by('-sku'))

        print(queryset)

        return queryset

А в моем HTML нужно показать значения внешнего ключа:

{% extends "base.html" %}

{% block content %}

    {% for article in article_list %}
        <div class="container">
            <h2>{{ article.translations.NEED_TO_SHOW_THAT_PARAMETER }}</h2>
        </div>
    {% endfor %}


{% endblock content %}

1 Ответ

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

По вашему мнению, вы уже получаете правильные данные.Таким образом, в вашем шаблоне вы можете просто пройтись по Article объектам и значениям их внешнего ключа (так как к ним можно получить доступ, используя related_name)

вы используете {% for article in article_list %}, поэтому я считаю, что у вас есть context_object_name = 'article_list' установить в ваших представлениях.

Я предполагаю дополнительные поля для translations модели, к которой вы, вероятно, хотите получить доступ.Если ваша модель выглядит примерно так:

class ArticleTranslation(models.Model):
    LANGUAGE_CHOICES = (
        (settings.ENGLISH, _("english")),
        (settings.FRENCH, _("french")),
        (settings.GERMAN, _("german")),
        (settings.ITALIAN, _("italian")),
        (settings.PORTUGUESE, _("portuguese")),
        (settings.SPANISH, _("spanish")),
    )
    article = models.ForeignKey(
        'Article',
        on_delete=models.CASCADE,
        related_name='translations',
    )
    language = models.CharField(max_length=10, choices=LANGUAGE_CHOICES)

Тогда в вашем шаблоне вы можете сделать:

{% extends "base.html" %}

{% block content %}
    {% for article in article_list %}
        <div class="container">
            {% for object in article.translations.all %}
                <h2>Chosend language - {{ object.language }}</h2>
            {% endfor %}
        </div>
    {% endfor %}

{% endblock content %}

Объяснение: article.translations.all даст вам все переводы за один article,используя это, вы можете получить значение поля

...