Django - 具有中间模型的多对多 - 使用Generic DetailView

时间:2016-04-02 14:16:12

标签: django django-templates django-views

A Work有许多贡献者,通过贡献者模型定义贡献者(实体 - 组或人),角色(作者,编辑,翻译)和归因确定性(明确,传统,推测等)。

为了使事情复杂化,一些额外的类扩展了Work(Text,Music ......及其子类)和Entity(Person,Group ......和不同类型的Group)....以及它对基类的所有多态性... 我碰巧正在处理的案例是一个人写的HymnText,但我认为与当前问题无关,因为我引用了基类(并成功地,否则)。

我正在尝试使用Generic DetailView。我知道(假设)我需要扩展DetailView才能访问贡献者列表......但不知道如何扩展它。

型号:

class Entry(PolymorphicModel):
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=500, blank=True)
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    slug = models.SlugField(unique=True)

class Work(Entry):
    contributors = models.ManyToManyField(Entity, through='Contribution', blank=True)

class Entity(Entry):
    pass

class Text(Work):
    content = models.TextField(blank=True)

class HymnText(Text):
    meter = models.ForeignKey(Meter, blank=True)


class Contribution(models.Model):
    contributor = models.ForeignKey(Entity)
    work = models.ForeignKey(Work)
    role = models.ForeignKey(ContributionRole)
    attribution_certainty = models.ForeignKey(AttributionCertainty, blank=True)

相关的urlpattern

urlpatterns = [
url(r'hymntext/(?P<slug>[a-zA-Z0-9]+(?:\-[a-zA-Z0-9]+)*)/$', EntryView.as_view(model=HymnText, template_name="cmi_index/entry.html"), name="hymntext" )
]

创建EntryView的无所事事

class EntryView(DetailView):
    pass

我试图在模板中做什么(不做深蹲)

{% for contributor in hymntext.contributors.all %}
   <br>{{ contributor.role.name }}: {{ contributor.contributor.name }}
{% endfor %}

有趣的是,在输出中......

我获得了保存到条目中的每个贡献者的换行符和冒号。所以模板知道他们在那里,我不能(不知道如何)访问他们的属性。

更新:

显然大部分信息都是可用的,我只是不确定如何获得它。

当我将模板更改为:

{% for contributor in hymntext.contributors.all %}
   <br>{{ contributor.role }}: {{ contributor.name }} -- {{contributor|pprint}}
 {% endfor %}

输出中的一些贡献者详细信息泄漏:

: David Haas -- <Person: David Haas (Person)> 
: John Newton -- <Person: John Newton (Person)>

如果我能得到人的名字,我当然可以获得贡献角色和其他任何东西,对吧......?我没有对View进行任何更改 - 这些都来自Generic Detail View。

2 个答案:

答案 0 :(得分:1)

其中一个(在视图类中作为上下文变量传递给模板之前执行)可能会有所帮助:

这是part of the Django docs,我帮助你。要从role HymnText

获取contributor之类的信息
contributor.contribution_set.get(work=hymntext).role

或者您可以调用Contribution模型:

# Loop through the hymntext contributors...
roles = []; names = []
for contributor in hymntext.contributors:
  contribution = Contribution.objects.get(work=hymntext, contributor=contributor)
  roles.push(contribution.role)
  names.push(contributor.name) # I assume you define this in your Entity model

# Then set up your context variables and render the template

答案 1 :(得分:0)

所以,答案实际上比看上去容易。

通过现场数据在模板中实际可用 通用视图(我怀疑)。 [through-model]_set获取它,然后您可以访问所有属性。这是我的Jinja模板代码

{% for contribution in hymntext.contribution_set.all %}
   <br>{{ contribution.role.name }}: {{ contribution.contributor.name }}
{% endfor %}

输出(在这个特定的假例子中):

  

创作者:David Haas   译者:约翰牛顿