Как исправить URL, не всегда перенаправляющий без косой черты в Django - PullRequest
1 голос
/ 07 апреля 2019

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

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

Вот мои взгляды.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 %}

Вот мой contact.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 %}

1 Ответ

1 голос
/ 07 апреля 2019

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

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

path('<single_slug>/', views.single_slug, name="single_slug")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...