如何在Django中修复URL时不总是重定向而不带斜线的问题

时间:2019-04-07 06:27:44

标签: python html django

我正在使用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 %}

1 个答案:

答案 0 :(得分:0)

Django会在添加斜杠之前尝试匹配所有所有 URL模式,因此single_slug模式将阻止这种情况,因为aboutcontact看起来很像。 /about/contact对于您发布的代码应以相同的方式对待,因此我无法解释为什么您看到的行为不同。

如果在single_slug路径中添加斜杠,则应将/about/contact重定向为附加斜杠,并匹配正确的模式。

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