Как исправить URL-адрес, который не всегда перенаправляется без косой черты в конце в Django

Я разрабатываю веб-приложение на Python с Django, и мои URL-адреса не всегда загружают правильное представление, если косая черта не добавлена. Страница «О программе» загружается нормально с косой чертой в конце и без нее, но моя страница контактов работает, только если добавлена ​​косая черта в конце. Это также влияет на некоторые другие страницы. В итоге он переходит к моей функции single_slug, которая является последним шаблоном в urls.py. Это следует делать, если в URL-адресе нет совпадения, но косая черта в конце каким-то образом препятствует совпадению. В итоге возвращается HttpResponse(f"{single_slug} ничему не соответствует!").

Я попытался добавить APPEND_SLASH = True в свой файл settings.py, но это ничего не изменило, поскольку по умолчанию оно уже имеет значение True.

Вот мой views.py:

from django.http import HttpResponse
from .models import Move, Artist
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import login, logout, authenticate
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import NewUserForm, ContactForm


# Create your views here.
def homepage(request):
    return render(request, 'main/home.html'

def about(request):
    return render(request, 'main/about.html')

def contact(request):
    form_class = ContactForm

    return render(request, 'main/contact.html', {
        'form': form_class,
    })

def single_slug(request, single_slug):
    artists = [a.artist_slug for a in Artist.objects.all()]
    if single_slug in artists:        
        artists = Artist.objects.filter(artist_slug__icontains=single_slug)
        return render(request, 'main/artist_detail.html', {'artists': artists})


    moves = [m.move_slug for m in Move.objects.all()]
    if single_slug in moves:
        moves = Move.objects.filter(move_slug__icontains=single_slug)
        return render(request, 'main/move_detail.html', {'moves': moves})

    return HttpResponse(f"{single_slug} does not correspond to anything!")

Вот мои модели.py:

class Move(models.Model):
        move_title = models.CharField(max_length=200)
        move_slug = models.SlugField(unique=True, max_length=250)

        def __str__(self):
            return self.move_title

        def save(self, *args, **kwargs):
            self.move_slug = slugify(self.move_title)
            super(Move, self).save(*args, **kwargs)

class Artist(models.Model):
        artist_name = models.CharField(max_length=200)
        artist_slug = models.SlugField(unique=True, max_length=250)

        def __str__(self):
            return self.artist_name

        def save(self, *args, **kwargs):
            self.artist_slug = slugify(self.artist_name)
            super(Artist, self).save(*args, **kwargs)

Вот мой urls.py:

from django.urls import path
from django.conf.urls import url
from . import views



app_name = 'main'  # here for namespacing of urls.

urlpatterns = [

    path('', views.homepage, name = "homepage"),
    path('about/', views.about, name = "about"),
    path('contact/', views.contact, name = "contact"),
    path('<single_slug>', views.single_slug, name = "single_slug"),


]

Вот мой about.html:

{% extends 'main/header.html' %}

{% block content %}

{% endblock %}

Вот мой контакт.html:

{% extends 'main/header.html' %}

{% block content %}
<h1>Contact</h1>
<form role = "form" action = "" method = "post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type = "submit">Submit</button>
</form>
{% endblock %}

привет, можете ли вы добавить какой-нибудь конкретный пример, который должен соответствовать чему-то еще выше single_slug? Спасибо.

yedpodtrzitko 07.04.2019 09:22

Обратите внимание, что if single_slug in artists: будет True только в том случае, если точный слаг совпадает, тогда как artist_slug__icontains будет True, если слаг содержится в artist_slug и нечувствителен к регистру. Возможно, было бы лучше удалить первое утверждение if, а затем проверить if artists:.

Alasdair 07.04.2019 11:20

Почему это было бы лучше, если я динамически генерирую имя слага с помощью функции сохранения? На случай, если я случайно поменяю регистр или что-то еще?

Coding Mom 08.04.2019 08:44

На данный момент вы получаете исполнителей дважды (artists = [a.artist_slug for a in Artist.objects.all()], а затем artists = Artist.objects.filter(...)). Но если вы измените это на artists = Artists.objects.filter(...), а затем отметите if artists:, то вы получите исполнителей только дважды, что более эффективно. Однако если вы внесете это изменение, поведение страницы немного изменится. Например. /eaTles/ начнет сопоставлять слаг beatles, потому что icontains ведет себя не так, как текущая проверка if single_slug in artists:.

Alasdair 08.04.2019 11:32

Обычный подход для представления одного объекта состоит в том, чтобы сделать что-то вроде artist = get_object_or_404(Artist, slug=single_slug) вместо artist = Artist.objects.filter(...) (что может соответствовать нескольким художникам). См. этот пример в учебнике.

Alasdair 08.04.2019 11:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
819
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Django пытается сопоставить шаблоны URL-адресов все, прежде чем добавить косую черту, поэтому шаблон single_slug предотвратит это, поскольку about и contact выглядят как слаги. /about и /contact должны рассматриваться одинаково для кода, который вы разместили, поэтому я не могу объяснить, почему вы видите для них разное поведение.

Если вы добавите косую черту к своему пути single_slug, то /about и /contact должны быть перенаправлены, чтобы добавить косую черту и соответствовать правильному шаблону.

path('<single_slug>/', views.single_slug, name = "single_slug")

Другие вопросы по теме