【问题标题】:Django - Accessing through ManyToMany extra field in templateDjango - 通过模板中的多对多额外字段访问
【发布时间】:2013-07-07 13:42:53
【问题描述】:

我有以下模型结构:

class Project(models.Model):
    title       = models.CharField(max_length = 100)
    publish     = models.BooleanField()
    cover       = models.ForeignKey(GenericMedia, related_name='+')
    media       = models.ManyToManyField(GenericMedia, through='AssocProjectMedia')
    credits     = models.ManyToManyField(AssocTitleName)

class GenericMedia(models.Model):
    limit           = models.Q(model = 'Image') | models.Q(model = 'Other')
    content_type    = models.ForeignKey(ContentType, limit_choices_to = limit)
    object_id       = models.PositiveIntegerField()
    content_object  = generic.GenericForeignKey('content_type', 'object_id')

    def __unicode__(self):
        return u"%s" % os.path.basename(self.content_object.url.name)

    def instance(self):
        return self.content_object.__class__.__name__


class AssocProjectMedia(models.Model):
    project     = models.ForeignKey(Project)
    media       = models.ForeignKey(GenericMedia)

    position    = models.PositiveSmallIntegerField()
    grid_size   = models.PositiveSmallIntegerField(null = True, blank = True)

    class Meta:
        ordering = ['position']

我一直在尝试使用以下内容在我的模板中获取位置数据(包括在 AssocProjectMedia 中):

在我看来:

project = get_object_or_404(Project, slug=project_slug)
    return render(request, 'projects/projects_details.html', {"project":project})

在我的模板中:

{% for media in project.media_set.all %}
...
{% endfor %}

但这不起作用,什么也没有出现。

如果我写:

{% for media in project.media.all %}
...
{% endfor %}

我将获得我的媒体数据,但不是包含在直通模型 (AssocProjectMedia) 中的媒体数据。

如果有人知道如何做到这一点......

【问题讨论】:

    标签: django django-templates foreign-keys many-to-many


    【解决方案1】:

    试试这个:

    {% for assoc_media in project.assocprojectmedia_set.all %}
        {{assoc_media.position}}
        {# or whatever field #}
    {% endfor %}
    

    【讨论】:

    • 哦,它的工作谢谢!是否可以更改“通过”关系的related_name?
    • 是否可以根据模板中的某个过滤器而不是 assocprojectmedia_set.all() 仅获取一行?例如,我想获得 project=xx, media=xx 的位置
    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2015-06-03
    • 2017-03-09
    • 2011-04-01
    相关资源
    最近更新 更多