我正在使用Django用Python开发一个Web应用程序,如果未添加结尾斜杠,则我的URL不会始终加载正确的视图。 “关于”页面可以很好地加载带有斜线和不带斜线的情况,但我的联系页面仅在添加了斜线后才有效。它还会影响其他一些页面。最终转到我的single_slug函数,这是urls.py中的最后一个模式。如果网址中没有匹配项,但是尾随斜杠以某种方式阻碍了匹配项,则应该这样做。最终返回HttpResponse(f“ {single_slug}不对应任何东西!”)。
我尝试在我的settings.py中添加APPEND_SLASH = True,但由于默认情况下它已经为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 %}
这是我的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 %}
答案 0 :(得分:0)
Django会在添加斜杠之前尝试匹配所有所有 URL模式,因此single_slug
模式将阻止这种情况,因为about
和contact
看起来很像。 /about
和/contact
对于您发布的代码应以相同的方式对待,因此我无法解释为什么您看到的行为不同。
如果在single_slug
路径中添加斜杠,则应将/about
和/contact
重定向为附加斜杠,并匹配正确的模式。
path('<single_slug>/', views.single_slug, name="single_slug")