I searched for hours but I could not find a solution. I am trying to filter conferences by country. Conference detail url works fine when I click on it from the main conference list. When I filter by country, the list of conferences in a given country are shown. However, when I click on a conference, it breaks and shows `Reverse for 'conference-detail' with keyword arguments '{'pk': '', 'slug': ''}' not found. 1 pattern(s) tried: ['conferences\\/details\\/(?P<pk>[0-9]+)\\/(?P<slug>[-a-zA-Z0-9_]+)\\/$']`. I cannot figure out the problem in my code.
Model:
from cities_light.models import Country, City
class Conference(models.Model):
title = models.CharField(max_length=512, default='')
slug = models.SlugField(max_length=512)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
city = models.ForeignKey(City, on_delete=models.CASCADE)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Conference, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('conferences:conference-detail', kwargs={'pk': self.pk, 'slug': self.slug})
urls.py:
path('', views.ConferenceListView.as_view(), name='conference-list'),
path('details/<int:pk>/<slug:slug>/', views.ConferenceDetailView.as_view(), name='conference-detail'),
path('country-list', views.ConferenceCountryListView.as_view(),
name='conference-country-list'),
path('country/<int:pk>/<slug:slug>/', views.ConferenceByCountryView.as_view(),
name='conferences-in-single-country'),
Views:
class ConferenceByCountryView(generic.ListView):
template_name = 'conferences/conferences_in_country_list.html'
context_object_name = 'conferences'
def get_queryset(self, *args, **kwargs):
country = Country.objects.get(pk=self.kwargs.get('pk', None))
return Conference.objects.filter(country=country)
def get_context_data(self, **kwargs):
context = super(ConferenceByCountryView, self).get_context_data(**kwargs)
country = Country.objects.get(pk=self.kwargs.get('pk', None))
context['country'] = country
context['title'] = 'Conferences in ' + ' country'
return context
class ConferenceDetailView(generic.DeleteView):
model = Conference
template_name = 'conferences/conference_detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = self.object.title
context['pk'] = self.object.pk
context['slug'] = self.object.slug
return context
In the conference list html, this is the code snippent: `<a href="{% url 'conferences:conference-detail' pk=conference.pk slug=conference.slug %}"><h6>{{ conference.title }}</h6></a>`. It redirects to the conference detail page without any problem. In the conference by country html, I have the following code:
<ul class="list-group">
{% for conferenc in conferences %}
<a class="list-group-item list-group-item-action" href="{% url 'conferences:conference-detail' pk=conference.pk slug=conference.slug %}"> {{ conferenc.title }} </a> {%comment%} Here is the problem. {% endcomment %}
{% endfor %}
</ul>
When I click on the url, it raises the following error:
Reverse for 'conference-detail' with keyword arguments '{'pk': '', 'slug': ''}' not found. 1 pattern(s) tried: ['conferences\\/details\\/(?P<pk>[0-9]+)\\/(?P<slug>[-a-zA-Z0-9_]+)\\/$']
Your kind help is highly appreciated.
-- Model:
from cities_light.models import Country, City
class Conference(models.Model):
title = models.CharField(max_length=512, default='')
slug = models.SlugField(max_length=512)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
city = models.ForeignKey(City, on_delete=models.CASCADE)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Conference, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('conferences:conference-detail', kwargs={'pk': self.pk, 'slug': self.slug})
urls.py:
path('', views.ConferenceListView.as_view(), name='conference-list'),
path('details/<int:pk>/<slug:slug>/', views.ConferenceDetailView.as_view(), name='conference-detail'),
path('country-list', views.ConferenceCountryListView.as_view(),
name='conference-country-list'),
path('country/<int:pk>/<slug:slug>/', views.ConferenceByCountryView.as_view(),
name='conferences-in-single-country'),
Views:
class ConferenceByCountryView(generic.ListView):
template_name = 'conferences/conferences_in_country_list.html'
context_object_name = 'conferences'
def get_queryset(self, *args, **kwargs):
country = Country.objects.get(pk=self.kwargs.get('pk', None))
return Conference.objects.filter(country=country)
def get_context_data(self, **kwargs):
context = super(ConferenceByCountryView, self).get_context_data(**kwargs)
country = Country.objects.get(pk=self.kwargs.get('pk', None))
context['country'] = country
context['title'] = 'Conferences in ' + ' country'
return context
class ConferenceDetailView(generic.DeleteView):
model = Conference
template_name = 'conferences/conference_detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = self.object.title
context['pk'] = self.object.pk
context['slug'] = self.object.slug
return context
In the conference list html, this is the code snippent: `<a href="{% url 'conferences:conference-detail' pk=conference.pk slug=conference.slug %}"><h6>{{ conference.title }}</h6></a>`. It redirects to the conference detail page without any problem. In the conference by country html, I have the following code:
<ul class="list-group">
{% for conferenc in conferences %}
<a class="list-group-item list-group-item-action" href="{% url 'conferences:conference-detail' pk=conference.pk slug=conference.slug %}"> {{ conferenc.title }} </a> {%comment%} Here is the problem. {% endcomment %}
{% endfor %}
</ul>
When I click on the url, it raises the following error:
Reverse for 'conference-detail' with keyword arguments '{'pk': '', 'slug': ''}' not found. 1 pattern(s) tried: ['conferences\\/details\\/(?P<pk>[0-9]+)\\/(?P<slug>[-a-zA-Z0-9_]+)\\/$']
Your kind help is highly appreciated.
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/01419589-cba7-44ed-99ed-9fcc2708f2fc%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
No comments:
Post a Comment