get() вернул более одного журнала-он вернул 2! в представлениях на основе классов django

#django #django-class-based-views

Вопрос:

Я пытаюсь получить сообщение в блоге, где каждое сообщение имеет свой уникальный URL-адрес с заголовком
views.py:

 from .models import Log, Comments, Like, Solutions
from django.views.generic import ListView, DetailView

class LogListView(ListView):
    model = Log
    template_name = 'log/home.html'
    context_object_name = 'item'
    ordering = ['-created']

class LogDetailView(DetailView):
    model = Log
    slug_url_kwarg = 'question'
    slug_field = 'slug'
 

home.html:

 {% extends 'log/base.html' %}

{% block content %}
<title> Error logger - Home</title>

{% if item %}
{%for i in item %}

<div class='m-4'>
    <div class="container main" style="width: 50vw;">
        <a class='link' href="{% url 'log-detail' i.slug %}"><h2 >{{ i.title }}</h2></a>
        <p>{{ i.content }}</p>
        <p class='small'>{{ i.created }}</p>
    </div>

</div>

{% endfor %}


{% else %}

<h3 class='container mt-4'>No questions to show</h3>
{% endif %}

{% endblock content  %}
 

urls.py:

 from django.urls import path
from .views import LogListView, LogDetailView

urlpatterns = [
    path('', LogListView.as_view(), name='home'),
    path('question/<slug:question>', LogDetailView.as_view(), name='log-detail'),

]
 

Я получаю сообщение об ошибке, в котором говорится get() returned more than one Log -- it returned 2!
Почему я получаю эту ошибку и что я должен сделать, чтобы исправить ее?
Это прекрасно работает, если я использую <int:pk> вместо <slug:question>

введите описание изображения здесь

Правка: Я обнаружил, что было две пули с одинаковым названием и, следовательно, создал эту ошибку..

В чем заключается исправление, если есть два одинаковых названия, как изменить слизень?

Комментарии:

1. Привет, Анируд! Вы используете подробное представление для отображения данных, относящихся к определенному журналу. DetailView пытается получить ваш объект в базе данных с помощью Log.objects.get(). Когда .get() обнаруживает более одной строки, которая соответствует вашему запросу (в этом случае запрос через поле slugfield кажется неоднозначным), он создает исключение. Вы можете либо использовать, например, идентификатор в URL-адресе, чтобы указать свой объект, либо изменить способ, которым представление сведений извлекает ваш объект (.filter() вместо .get()).

2. Да, я понял это.. Не могли бы вы объяснить, пожалуйста, ошибка заключалась в том, что у меня было 2 одинаковых вопроса (точно таких же). Таким образом, было 2 точно таких же пули, которые выдали эту ошибку.. Что я могу сделать, чтобы различать их между собой?

3. Привет, Анируд, если вы хотите использовать slug с get, он должен быть уникальным, иначе, как предложил Ив Хари, вы можете использовать фильтр. пожалуйста, обратитесь к официальному документу, чтобы сделать поле уникальным : docs.djangoproject.com/en/3.2/ref/models/fields/…

4. Я понимаю. Так, может быть, вы можете использовать уникальный идентификатор вместо слизняка? Или вы можете предотвратить создание одних и тех же вопросов несколько раз? Если вам нужен слиток для лучшей читаемости и вы не хотите устранять повторяющиеся вопросы, я думаю, вы могли бы объединить слиток с числом или около того, но это мне неизвестно.

5. Спасибо @YvesHary, я добавил номер в конце URL-адреса