Ошибка ключа в основанном на классе DetailView - PullRequest
0 голосов
/ 20 мая 2018

У меня была эта проблема несколько раз раньше, но я всегда мог ее решить.На этот раз я не могу.Его просто возвращают:

"Ошибка ключа в потоках / sport_slug 'pk'"

Ошибка в строке 34 в представлениях, которые я выделил ниже:

Views.py:

class StreamSport(ListView):
    template_name = "stream/stream-index.html"
    context_object_name = 'stream_list'

    def get_queryset(self):
        self.sport = get_object_or_404(Sport, sport_slug=self.kwargs['sport_slug'])
        *self.pk = get_object_or_404(Video, pk=self.kwargs['pk'])*
        return Video.objects.filter(sport=self.sport, pk=self.pk)

URLs.py:

app_name = 'streams'

urlpatterns = [
    path('', StreamIndex.as_view(), name='stream-index'),
    path('<slug:sport_slug>/', StreamSport.as_view(), name='stream-sport'),
    path('<slug:sport_slug>/<int:pk>/', StreamDetail.as_view(), name='detail'),

stream-index.html:

<a href="{% url 'streams:detail' video.sport.sport_slug video.pk %}"

Редактировать: As LemayzeurЯ запутался.Ошибка ключа была вызвана попыткой исправить другую ошибку.Я думал, что добился прогресса, когда вместо этого я двигался назад.Первоначальная ошибка, к которой я вернулся, - это ошибка «Обратно для« детализации »с аргументами».

Чтобы уточнить, я пытаюсь создать ListView, в котором перечислены все видео в модели, а затем связать каждое из этих видео со своей собственной страницей сведений.Это само DetailView, которое вызывает у меня некоторую проблему:

class StreamDetail(DetailView):
    model = Video
    template_name = 'stream/detail.html'

    def get_queryset(self):
        self.sport = get_object_or_404(Sport, sport_slug=self.kwargs['sport_slug'])
        self.pk = Video.objects.filter(pk=self.kwargs['pk'])
        return Video.objects.filter(sport=self.sport, pk=self.pk)

Это ошибка, которую он мне дает:

Reverse for 'detail' with arguments '(2,)' not found. 1 pattern(s) tried: ['stream\\/(?P<sport_slug>[-a-zA-Z0-9_]+)\\/(?P<pk>[0-9]+)\\/$']

Сама трассировка крайне бесполезна, и она просто указывает на bootstrapcdnв базовом файле.

stream-index.html:

{% for video in stream_list %}
  <div class="card" style="width: 20rem;margin-left: 2rem;">
            <img class="card-img-top" src="{{video.headline_image.url}}" alt="Card image cap" style="width: 20rem;">
            <div class="card-body" style="width: 18rem;">
              <h5 class="card-title"><a href="{% url 'streams:detail' video.id %}">{{video.name}}</a></h5>
              <p class="card-text" style="width: 18rem;">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              <a href="{% url 'streams:detail' video.sport.sport_slug video.pk %}" class="btn btn-success">Watch Now</a>
              <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
{% endfor %}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Ошибка не в размещенном вами URL: проверьте эту строку

вместо

<h5 class="card-title"><a href="{% url 'streams:detail' video.id %}">{{video.name}}</a></h5>

она должна быть

<h5 class="card-title"><a href="{% url 'streams:detail' video.sport.sport_slug video.pk %}">{{video.name}}</a></h5>
0 голосов
/ 20 мая 2018

Как показано в полном фрагменте, в вашем шаблоне вы только передаете video.id тегу url, тогда как для подробного URL-адреса требуются id и slug.Обязательно передайте им оба:

<a href="{% url 'streams:detail' video.sport.sport_slug video.id %}">
...