如何在 Django 模板中使用带有外键对象的 get_absolute_url()

Posted

技术标签:

【中文标题】如何在 Django 模板中使用带有外键对象的 get_absolute_url()【英文标题】:How to Use get_absolute_url() with a foreign key object in Django template 【发布时间】:2018-04-21 06:59:35 【问题描述】:

我对 django 比较陌生,我已经搜索过这个问题,但找不到解决方案。如果解决方案很明显,但我似乎无法正确解决,请原谅我。

所以,这就是问题所在。我有两个模型 ParishionerCommunity。 Parishioner 与 Community 具有多对一的关系。在 parishioner_detail 页面上,我试图将社区名称显示为 community_detail 页面的链接。我觉得我没有正确使用 get_absolute_url() 方法。任何帮助将不胜感激。

型号:

from django.db import models
from django.core.urlresolvers import reverse

class Community(models.Model):
    name = models.CharField(max_length=41)
    description = models.TextField()
    leader = models.CharField(max_length=41)
    email = models.EmailField()
    phone_number = models.CharField(max_length=20)
    slug = models.SlugField(max_length=31, unique=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('people_community_detail', kwargs='slug': self.slug)

class Parishioner(models.Model):
    name = models.CharField(max_length=41)
    date_of_birth = models.DateField('date of birth', blank=True)
    email = models.EmailField()
    phone_number = models.CharField(max_length=20)
    start_date = models.DateField('date posted')
    societies = models.ManyToManyField(Society, blank=True, related_name='parishoners')
    communities = models.ForeignKey(Community, blank=True, related_name='parishoners')
    sacraments = models.ManyToManyField(Sacrament, blank=True, related_name='parishoners')
    slug = models.SlugField(max_length=31, unique=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('people_parishioner_detail', kwargs='slug': self.slug)

    class meta:
        ordering = ['name']
        verbose_name_plural = "parishioners"

观看次数:

from django.shortcuts import get_object_or_404, render, redirect
from .models import Society, Community, Sacrament, Festival, Parishioner

def community_list(request):
    return render(request, 'people/community_list.html', 'community_list': Community.objects.all())

def community_detail(request, slug):
    community = get_object_or_404(Community, slug__iexact=slug)
    return render(request, 'people/community_detail.html', 'community': community)

def parishioner_list(request):
    return render(request, 'people/parishioner_list.html', 'parishioner_list': Parishioner.objects.all())

def parishioner_detail(request, slug):
    parishioner = get_object_or_404(Parishioner, slug__iexact=slug)
    return render(request, 'people/parishioner_detail.html', 'parishioner': parishioner)

parishioner_detail.html:

<dt>Community</dt>
  <dd><a href=" community.get_absolute_url "> parishioner.communities|title </a></dd>
<dt>Societies</dt>
  % for society in parishioner.societies.all %
    <dd><a href=" society.get_absolute_url "> society.name|title </a></dd>
  % endfor %

社团名称正确链接到 social_detail 页面,但社区名称链接到 parishioner_detail 页面而不是 community_detail 页面。它基本上会重新加载页面。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

【参考方案1】:

community 名称在您的上下文中不存在,因此 href 链接为空,您会被重定向到同一页面。

你可能应该这样做:

 <dt>Community</dt>
 <dd><a href=" parishioner.communities.get_absolute_url "> parishioner.communities|title </a></dd>

最好将communities 字段更改为单数(即community),因为它是一个外键字段,因此不太容易混淆;一个教区居民到一个社区(不是多个社区)。

【讨论】:

非常感谢摩西,它就像一个魅力。还将社区更改为社区。​​span>

以上是关于如何在 Django 模板中使用带有外键对象的 get_absolute_url()的主要内容,如果未能解决你的问题,请参考以下文章

在 django 模板中过滤外键对象

Django 将带有外键的查询集转换为 JSON

Python:如何在我的 Django 模板中传递外键的值?

如何在不同的数据库中使用带有外键的 django 模型?

使用带有外键的 Q 对象定义 django 查询集

将带有外键的自定义标签呈现到模板问题中