LINUX.ORG.RU

NoReverseMatch прошу помощи

 ,


0

1

Добрый день ЛОР. Имеется модель:

class Loureats(models.Model):

    class Meta():
        db_table='loureats'
        verbose_name='Лоуреат'
        verbose_name_plural='Лоуреати'

    year = models.ForeignKey(LoureatsYear, on_delete=models.CASCADE, blank=True, null=True)
    name = models.CharField(verbose_name='Название', max_length=400)
    logo = ProcessedImageField(verbose_name='Логотип', upload_to='loureats/', processors=[ResizeToFit(300)], format='JPEG',
                                options={'quality': 90})
    description = models.TextField(verbose_name='О луореате')
    photo = ProcessedImageField(upload_to='loureats/photo/', processors=[ResizeToFit(300)], format='JPEG',
                                options={'quality': 90})
    create = models.DateTimeField(verbose_name='Дата создания', default=timezone.now)
    update = models.DateTimeField(verbose_name='Дата обновления', auto_now=True)
    moder = models.BooleanField(verbose_name='Модерация', default=False)

    def __str__(self):
        return self.name

Вьюха:

def loureats_list(reguest, slug):
    year = LoureatsYear.objects.get(slug=slug)
    loureats = Loureats.objects.filter(year=year)
    return render(reguest, 'loureats/loureats_list.html', {
        'year': year,
        'loureats': loureats}
    )

def loureats_detail(request, pk):
    template='loureats/loureats_detail.html'
    loureats_detail = get_object_or_404(Loureats, pk=pk)
    return render(request, template, {'loureats_detail': loureats_detail})

urls:

path('loureats/<slug>/', views.loureats_list, name='loureats_list'),
path('loureats/<pk>/', views.loureats_detail, name='loureats_detail'),

И ссылка в шаблоне для перехода к детальному описанию:

{% for item in loureats %}
<h1><a href="{% url 'base:loureats_detail' pk=loureats_detail.pk %}">{{ item.name }}</a></h1>
{% endfor %}

При переходе loureats/<slug>/ получаю такую ошибку:

Reverse for 'loureats_detail' with keyword arguments '{'pk': "}' not found. 1 pattern(s) tried: ['loureats\\/(?P<pk>[^/]+)\\/$']

Новости вывожу таким же образом, и все работает. Что я делаю не так?

★★

также наверное для урлов нужно прописать типы, для pk вероятно должны быть только цифры, иначе эти 2 урла могут конфликтовать

path('loureats/<slug:slug>/', views.loureats_list, name='loureats_list'),
path('loureats/<int:pk>/', views.loureats_detail, name='loureats_detail'),
или еще лучше:
path('loureats/<slug:slug>/', views.loureats_list, name='loureats_list'),
path('loureats/<slug:slug>/<int:pk>/', views.loureats_detail, name='loureats_detail'),

Int64 ★★★ ()
Ответ на: комментарий от Int64

Лист ссылок появился, теперь не идет в полную новость.

DoesNotExist at /loureats/1/

LoureatsYear matching query does not exist.

говорит что проблема в этой строке.

year = LoureatsYear.objects.get(slug=slug)
xaTa ★★ ()
Ответ на: комментарий от xaTa

ну, если ты сделал как я предложил с путями, то для получения ссылки на полную новость надо передать 2 аргумента slug и pk, а так он походу пытается зарезолвить `loureats/<slug:slug>/` вмето `loureats/<slug:slug>/<int:pk>/`, т.е. как-то так:

{% for item in loureats %}
    <h1>
        <a href="{% url 'base:loureats_detail' slug=item.year.slug pk=item.pk %}">
            {{ item.name }}
        </a>
    </h1>
{% endfor %}

Int64 ★★★ ()
Ответ на: комментарий от xaTa

также лучше использовать не прямой вызов get, иначе получишь исключение, а желательно навернео получить ошибку 404 - ресурс не найден. т.е. вместо:

year = LoureatsYear.objects.get(slug=slug)
сделать так:
year = get_object_or_404(LoureatsYear, slug=slug)
https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/#get-object-or-404

Int64 ★★★ ()