Django | Страница не найдена (404) Ни один автомобиль не соответствует заданному запросу
Я пытался создать форму для создания новой статьи на сайте, но вылезла эта ошибка. Я перепроверил все 10 раз, но не понимаю в чем ошибка.
hello/urls.py :
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='hello'),
path("cars/<slug:car_slug>/", views.car_slug, name='car_slug'),
path('cars/addpost/', views.addpost, name='addpost')
]
hello/views.py :
from django.shortcuts import get_object_or_404, render, redirect
from .models import *
from .forms import *
def index(request):
data = {}
return render(request, 'hello/index.html', data)
def car_slug(request, car_slug):
car = get_object_or_404(Cars, slug=car_slug)
data = {
'car': car
}
return render(request, 'hello/car_pk.html', data)
def addpost(request):
if request.method == 'POST':
form = AddPostForm(request.POST)
if form.is_valid():
Cars.objects.create(**form.cleaned_data)
return redirect("hello")
else:
form.add_error(None, "Ошибка добавления поста")
else:
form = AddPostForm()
data = {
'form': form,
'title': 'Добавление поста'
}
return render(request, 'hello/addpost.html', data)
hello/forms.py:
from django import forms
from .models import *
class AddPostForm(forms.Form):
title = forms.CharField(label='Название', max_length=300)
slug = forms.SlugField(label='URL', max_length=40)
content = forms.CharField(label='Характеристика', widget=forms.Textarea(attrs={'cols':60,
'rows': 10}))
is_published = forms.BooleanField(label='Состояние', required=False, initial=True)
brand = forms.ModelChoiceField(queryset=Brands.objects.all(), label="Бренды",
empty_label='Не выбрано')
hello/models.py :
from django.urls import reverse
from django.db import models
class Cars(models.Model):
title = models.CharField(max_length=255, verbose_name="Название")
slug = models.SlugField(verbose_name="URL", unique=True, db_index=True, max_length=255)
content = models.TextField(verbose_name="Характеристика", null=True)
time_create = models.DateField(verbose_name='Дата публикации', auto_now_add=True)
is_published = models.BooleanField(default=True )
brand = models.ForeignKey('Brands', on_delete=models.PROTECT)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('car_slug', kwargs={'car_slug': self.slug})
class Meta:
verbose_name = 'Машины'
verbose_name_plural = 'Машины'
class Brands(models.Model):
name = models.CharField(verbose_name="Бренды", max_length=250)
slug = models.SlugField(verbose_name="URL", unique=True, db_index=True, max_length=255)
def __str__(self):
return self.name
class Meta:
verbose_name = "Бренды"
verbose_name_plural = 'Бренды'
Here is a photo from the error:enter image description here Atsukatsup tszcdlpoyzshchayusz aytsoashchoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaoyzhaojl aofyadlafyadlofyadlafyadlafyadlafyadlafyadlafyadl laoofyadlafyadlofyadlafyadlfovyadlfovyadlfvfovyadlfovyadlfov
>> Появляется ли он в оболочке? python manage.py shell
from hello.models import Cars
Cars.objects.filter(slug='insert_car_slug').first()
# if above is empty run this:
for i in Cars.objects.all():
print('slug:', i.slug)
Я думаю, что проблема может быть в том, что поле slug Url... потому что оно валидируется как полный Url. При переходе к этому представлению вы передаете ему только addpost
, что не будет полным Url ... возможно, просто измените это поле на CharField
и в addpost View, внутри form.is_valid()
, это может выглядеть так:
if form.is_valid():
form.save()
return redirect("hello")
Возможно, лучше сделать так, чтобы формы были в Forms & представления были в Views.
Используйте этот код и проверьте
def car_slug(request, car_slug):
car = Cars.object.filter(slug=car_slug)
data = {
'car': car
}
return render(request, 'hello/car_pk.html', data)
покажите нам ошибку с вашего терминала
Попробуйте проверить еще раз с ASCII символами slug.
Похоже, вы генерируете некоторые символы Unicode, которые не будут работать с django slug https://docs.djangoproject.com/en/4.1/topics/http/urls/#path-converters.
Согласно их документам
slug - Сопоставляет любую строку slug, состоящую из ASCII букв или цифр, плюс символы дефиса и подчеркивания. Например, building-your-1st-django-site.
.
Для того, чтобы работать с Unicode slug, измените путь к маршрутизатору на:
path(r'cars/(?P<slug>[^/.]+)/', views.car_slug, name='car_slug'),
Дополните regex-часть [^/.]+, если вам нужно что-то еще для проверки пути.