#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-адреса