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。
答案 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 译者:约翰牛顿