Представления Django открывают другое содержимое

#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'),