【问题标题】:Fetch Django models in list view to show both在列表视图中获取 Django 模型以显示两者
【发布时间】:2019-09-24 02:13:33
【问题描述】:

我有这个模型:

文章:

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
    )
...

和文章翻译:

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',
    )

我需要返回两者,结合起来显示 Django 模板 HTML 中的 2 个项目。需要拥有项目和外键并在相同的迭代中看到它。我想用 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 %}

【问题讨论】:

  • {{ article.translations.all }} 是模板中translations 的列表(相当于python 代码中的article.translations.all())。因此,您可以循环播放它,例如 {% for translation in article.translations.all %} 并在循环中显示您想要的任何内容,例如{{ translation.id }}.

标签: python django listview foreign-keys django-queryset


【解决方案1】:

在您看来,您已经获得了正确的数据。因此,在您的模板中,您可以简单地遍历 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 的所有翻译,使用这个你可以获得字段值

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多