#html #django #url #view #django-views
#HTML #django #url #Вид #django-представления
Вопрос:
Я новичок в Django. Однако я создал 2 отдельных представления и URL-адреса, когда я загружаю свой сервер разработки и нажимаю на слайды, чтобы открыть slides_detail.html , он открывается sub_detail.html , на данный момент я понятия не имею, что могло вызвать это, поскольку нет похожих имен, которые привели бы к открытию совершенно другой страницы сведений. Оба слайда и субконтента находятся в одном и том же документе HTML, то же самое с URL-адресами и представлениями. Ошибок нет, чтобы показать. Заранее спасибо:
URL-АДРЕСА:
path('<int:sub_id>/', views.sub_detail, name='sub_detail'),
path('<int:slides_id>/', views.slides_detail, name='slides_detail'),
Число просмотров:
# Will show specific sub content details
def sub_detail(request, sub_id):
subcontent = get_object_or_404(SubContent, pk=sub_id)
context = {
'subcontent': subcontent,
}
return render(request, 'home/sub_detail.html', context)
# Will show specific slides content details
def slides_detail(request, slides_id):
slides = Slides.objects.get(pk=slides_id)
context = {
'slides': slides,
}
return render(request, 'home/slides_detail.html', context)
HTML для слайдов:
{% for slides in slides %}
<div class="swiper-slide">
<div class="card">
<a href="{% url 'slides_detail' slides.id %}">
<img src="{{ slides.image.url }}" class="card-img-top img-height" alt="..."></a>
<div class="card-body bg-dark">
<h5 class="card-title text-light font-weight-bold text-center">{{ slides.title }}</h5>
</div>
</div>
</div>
{% endfor %}
HTML для субконтента:
{% for sub in subcontent %}
{% if forloop.counter|divisibleby:2 %}
<div class="row">
{% if sub.image %}
<div class="col-md-6 section-index-img">
<img src="{{ sub.image.url }}" class="rounded img-fluid" alt=""/>
</div>
{% endif %}
<div class="col-md-6">
<a href="{% url 'sub_detail' sub.id %}">
<h4>{{ sub.title }}</h4>
</a>
<p class="text-muted">{{ sub.description | linebreaks }}</p>
</div>
</div>
{% else %}
Комментарии:
1. Шаблоны перекрываются, поэтому путь
/2
вызовет первое совпадающее представление, в данном случаеsub_detail
.2. нужно ли мне для этого изменить представление или URL?
3. Вам нужно добавить к каждому URL-адресу что-то уникальное, чтобы оно соответствовало только одному нужному вам случаю. Если у вас есть запись для
sub_id == 1
и один дляslide_id == 1
, тогда URL/1/
-адрес будет соответствовать первому в списке. Вызовите их/sub/<int:pk>/
и/slide/<int:pk>/
вместо этого, и проблема исчезнет.4. Спасибо, но когда я это делаю, это дает мне 404, однако, когда я сначала удаляю / из /sub/<int:pk>/ , оставляя sub/<int:pk>/, он работает отлично. Еще раз, спасибо. Вы знаете, как я могу найти документацию для этого, чтобы узнать больше?
Ответ №1:
Я создал 2 отдельных представления и URL-адреса, однако, когда я загружаю свой сервер разработки и нажимаю на слайды, чтобы открыть
slides_detail.html
, он открываетсяsub_detail.html
.
Вы не создавали два отдельных URL-адреса, вы создали один и тот же путь. Оба пути будут запускаться по одним и тем же шаблонам. Таким образом, это означает, что если у вас есть {% url 'slides_detail' 42 %}
, например, a , он будет записан как /42
, но это также допустимый путь для sub_detail
, поэтому, когда вы делаете запрос с этим путем, Django «запускает» первое совпадающее представление, в данном случае sub_detail
.
Вы должны сделать пути неперекрывающимися, например:
path('sub/<int:sub_id>/', views.sub_detail, name='sub_detail'),
path('slide/<int:slides_id>/', views.slides_detail, name='slides_detail'),