Python 如何修复在Django中不总是在没有尾随斜杠的情况下重定向的URL

Python 如何修复在Django中不总是在没有尾随斜杠的情况下重定向的URL,python,html,django,Python,Html,Django,我正在用Python和Django开发一个web应用程序,如果没有添加尾随斜杠,我的url就无法始终加载正确的视图。“关于”页面在有或没有尾随斜杠的情况下都可以正常加载,而“我的联系人”页面仅在添加尾随斜杠的情况下才有效。它还影响其他一些页面。它最终进入我的single_slug函数,这是url.py中的最后一个模式。如果url中没有匹配项,但后面的斜杠以某种方式阻碍了匹配,则应该这样做。它最终返回HttpResponse(f“{single_slug}不对应任何东西!”) 我尝试在我的sett

我正在用Python和Django开发一个web应用程序,如果没有添加尾随斜杠,我的url就无法始终加载正确的视图。“关于”页面在有或没有尾随斜杠的情况下都可以正常加载,而“我的联系人”页面仅在添加尾随斜杠的情况下才有效。它还影响其他一些页面。它最终进入我的single_slug函数,这是url.py中的最后一个模式。如果url中没有匹配项,但后面的斜杠以某种方式阻碍了匹配,则应该这样做。它最终返回HttpResponse(f“{single_slug}不对应任何东西!”)

我尝试在我的settings.py中添加APPEND_SLASH=True,但它没有改变任何内容,因为默认情况下它已经是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!")

这是我的models.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)

这是我的URL.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"),


]
这是我的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 %}
{%extends'main/header.html%}
{%block content%}
接触
{%csrf_令牌%}
{{form.as_p}}
提交
{%endblock%}
Django试图在添加斜杠之前匹配所有URL模式,因此
单段塞
模式将防止出现这种情况,因为
about
contact
看起来像段塞<代码>/about和
/contact
应该以与您发布的代码相同的方式进行处理,因此我无法解释为什么您会看到他们有不同的行为

如果在
单段塞
路径中添加尾随斜杠,则应重定向
/about
/contact
以添加斜杠,并匹配正确的模式

path('<single_slug>/', views.single_slug, name="single_slug")
路径('/',views.single_slug,name=“single_slug”)
hi,您是否可以添加任何特定的示例,这些示例应该与上面的
single_slug
匹配?谢谢。请注意,
如果美术师中的单段塞:
只有在精确段塞匹配的情况下才会为
,而
美术师段塞icontains
如果段塞包含在
美术师段塞
中且不区分大小写,则将为
。最好删除第一个
if
语句,然后再检查
if-artists:
。既然我用save函数动态生成slug名称,为什么这样会更好?以防我意外更改了case或其他内容?目前,您正在两次获取艺术家(
artists=[a.artist\u slug for a in-artist.objects.all()]
,然后
artists=artist.objects.filter(…)
)。但是如果您将其更改为
artists=artists.objects.filter(…)
,然后选中
if-artists:
,则只获取两次艺术家,这样效率更高。但是,如果进行此更改,页面的行为将略有改变。比如说
/eaTles/
将开始匹配slug
披头士
,因为
icontains
的行为不同于当前检查
如果艺术家中有单个slug:
。单个对象视图的常用方法是执行类似于
艺术家=获取对象或404(艺术家,slug=单个slug)的操作
而不是
artist=artist.objects.filter(…)
(可以匹配多个艺术家)。请参见教程中的。
path('<single_slug>/', views.single_slug, name="single_slug")