Am relatively new to django and I have searched for this problem but couldn't find a solution. Forgive me if the solution is obvious but I just can't seem to get it right.
So, this is the issue. I have two models Parishioner and Community. Parishioner has a many-to-one relationship with Community. On the parishioner_detail page, I am trying to display the community name as a link to the community_detail page. I feel I am not using the get_absolute_url() method correctly. Any help would be appreciated.
Models:
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"
Views:
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 %}
The society name links correctly to the society_detail page but the community name links to the parishioner_detail page instead of the community_detail page. It basically reloads the page.
Any help would be appreciated. Thanks.
The community
name does not exist in your context, the href link is therefore empty and you get redirects to the same page.
You should probably be doing:
<dt>Community</dt>
<dd><a href="{{ parishioner.communities.get_absolute_url }}">{{ parishioner.communities|title }}</a></dd>
Better to change the communities
field to singular (i.e. community
) since it's a foreign key field, so it's less confusing; one parishioner to one community (not multiple communities).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With