#python #django #django-urls
#python #django #django-urls
Вопрос:
ПРИВЕТ, работаю над новым сайтом с использованием Django. кажется, не могу разобраться с этой ошибкой. Сначала предполагаемый сайт будет структурирован как;
Домашняя страница — отображение разных языков со ссылками на страны, в которых вы можете изучать эти языки. Нажмите на страну на домашней странице -> Страница страны На странице страны будут перечислены все школы, которые преподают этот язык в этой стране. Нажмите на школу на странице страны -> Страница школы.
Я выяснил, что эта строка кода на странице страны вызывает проблему, но я не знаю, как это исправить
<a href="{% url 'schools' schools.id %}">
<div class="left"><h4>Test Link</h4></div>
</a>
Это ошибка, которую я получаю в браузере
NoReverseMatch at /5/ Reverse for 'schools' with arguments '('',)' not found. 1 pattern(s) tried: ['(?P<country_id>[0-9] )/(?P<schools_id>[0-9] )/
Код из проекта:
Models.py
from django.db import models
class Languages(models.Model):
language = models.CharField(max_length=100, blank=True, null=True)
country = models.ManyToManyField('Country', blank=True)
image = models.CharField(max_length=100, blank=True)
def __str__(self):
return self.language
class Country(models.Model):
country_name = models.CharField(max_length=50)
country_image = models.CharField(max_length=100, blank=True)
country_city = models.ManyToManyField('City', blank=True)
def __str__(self):
return self.country_name
class City(models.Model):
city_name = models.CharField(max_length=50)
city_image = models.CharField(max_length=1000, blank=True)
city_schools_in = models.ManyToManyField('Schools', blank=True)
def __str__(self):
return self.city_name
class Schools(models.Model):
school_name = models.CharField(max_length=100)
school_image = models.CharField(max_length=1000, blank=True)
school_country = models.ManyToManyField('Country', blank=True)
school_city = models.ManyToManyField('City', blank=True)
school_description = models.TextField()
school_accreditations = models.ManyToManyField('Accreditations', blank=True)
school_lpw = models.IntegerField()
school_cs = models.IntegerField()
school_course = models.ManyToManyField('CoursePrices', blank=True)
def __str__(self):
return self.school_name
class Accreditations(models.Model):
accreditation_name = models.CharField(max_length=50)
def __str__(self):
return self.accreditation_name
class CoursePrices(models.Model):
course_title = models.CharField(max_length=50, blank=True)
lessons_per_week = models.IntegerField()
class_size = models.IntegerField()
weekly_price = models.IntegerField()
language_level = models.CharField(max_length=50, blank=True)
def __str__(self):
return self.course_title
Views.py
from django.shortcuts import render
from django.http import Http404
from .models import Schools, CoursePrices, Languages, Country, City
def home(request):
languages = Languages.objects.all()
return render(request, 'home.html', {
'languages': languages,
})
def country(request, country_id):
try:
country = Country.objects.get(id=country_id)
except Languages.DoesNotExist:
raise Http404('Language not found')
return render(request, 'country.html', {
'country': country,
})
def schools(request, country_id, schools_id):
try:
schools = Schools.objects.get(id=schools_id)
except Schools.DoesNotExist:
raise Http404('school not found')
return render(request, 'schools.html', {
'schools': schools,
})
urls.py
from django.contrib import admin
from django.urls import path
from schools import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
path('<int:country_id>/', views.country, name='country'),
path('<int:country_id>/<int:schools_id>/', views.schools, name='schools'),
]
Скриншот структуры проекта
Любая помощь будет с благодарностью. Также, пожалуйста, простите любые ошибки в публикации или кодировании, все еще очень новичок в кодировании и переполнении стека / жизни в целом 🙂
Ответ №1:
Для вашего пути schools
требуется два аргумента, вы передали только один, поэтому он не смог соответствовать какому-либо маршруту.
Ваш комментарий к ответу Рафаэля о том, что он по-прежнему не соответствует пути, даже с предоставленными двумя аргументами, связан с порядком путей в вашем urls.py
файле.
Django просматривает список путей по порядку, и поскольку сначала найден путь с единственным параметром country_id
, он пытается это сделать, но терпит неудачу, потому что у вас есть второй параметр.
Чтобы исправить это, измените порядок ваших путей
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
# next two lines have been swapped.
path('<int:country_id>/<int:schools_id>/', views.schools, name='schools'),
path('<int:country_id>/', views.country, name='country'),
]
Комментарии:
1. Извините, похоже, вы были на 9 секунд раньше меня xD Почему люди всегда быстрее меня? : ( xD
2. @Rafael - Не беспокойтесь. Обычно я удивляюсь тому, как быстро люди отвечают на вопросы здесь: D
3. @Rafael Не беспокойтесь о том, что для публикации более развернутых ответов требуется больше времени. Лучше потратить время на то, чтобы дать хороший ответ, чем спешить с ним.
4. Привет, спасибо за обновление @Tony Я попробовал предложение, которое вы опубликовали (я предполагаю, что name ='schools'), предназначалось для конца строки выше?). Кажется, я все еще не могу заставить его работать. Я чувствую, что это может быть проблемой с тем, как я реализовал представления, поскольку я не передаю правильный идентификатор школы
5. @SkyFall спасибо! Глядя на ваш скриншот, я только что кое-что понял в вашей ошибке:
'('',)'
не похожи на целые числа. Вы уверены, что школы. идентификатор и country.id переменные шаблона существуют и являются целыми числами?
Ответ №2:
URL-адрес 'schools' нуждается в двух (2) аргументах. Вы передаете только один (1). В этом случае: schools.id
Django находит обратное совпадение только в том случае, если вы передаете правильное количество аргументов. В этом случае вы должны передать идентификатор страны И идентификатор школы.
Например {% url 'schools' country_id=country.id schools_id=schools.id %}
, если у вас также есть переменная country.
РЕДАКТИРОВАТЬ: '('',)'
в вашем сообщении об ошибке на самом деле не похожи на целые числа. Вы уверены, что переменные шаблона существуют и являются целыми числами?
Комментарии:
1. Привет, спасибо за ответ. это имеет смысл, я скопировал и вставил ваше предложение. по-прежнему получаю ошибку NoReverseMatch в /6/ Reverse для 'schools' с аргументами ключевого слова '{'country_id': 6, 'schools_id': "}' не найдено. попробовано 1 шаблон (ы): ['(?P<country_id>[0-9] )/(?P<schools_id>[0-9] )/$']
2. @SkyFall - я добавил к своему ответу, чтобы решить проблему, с которой вы столкнулись с параметрами.
]
Код из проекта:
Models.py
Views.py
urls.py
Скриншот структуры проекта
Любая помощь будет с благодарностью. Также, пожалуйста, простите любые ошибки в публикации или кодировании, все еще очень новичок в кодировании и переполнении стека / жизни в целом 🙂
Ответ №1:
Для вашего пути schools
требуется два аргумента, вы передали только один, поэтому он не смог соответствовать какому-либо маршруту.
Ваш комментарий к ответу Рафаэля о том, что он по-прежнему не соответствует пути, даже с предоставленными двумя аргументами, связан с порядком путей в вашем urls.py
файле.
Django просматривает список путей по порядку, и поскольку сначала найден путь с единственным параметром country_id
, он пытается это сделать, но терпит неудачу, потому что у вас есть второй параметр.
Чтобы исправить это, измените порядок ваших путей
Комментарии:
1. Извините, похоже, вы были на 9 секунд раньше меня xD Почему люди всегда быстрее меня? : ( xD
2. @Rafael — Не беспокойтесь. Обычно я удивляюсь тому, как быстро люди отвечают на вопросы здесь: D
3. @Rafael Не беспокойтесь о том, что для публикации более развернутых ответов требуется больше времени. Лучше потратить время на то, чтобы дать хороший ответ, чем спешить с ним.
4. Привет, спасибо за обновление @Tony Я попробовал предложение, которое вы опубликовали (я предполагаю, что name =’schools’), предназначалось для конца строки выше?). Кажется, я все еще не могу заставить его работать. Я чувствую, что это может быть проблемой с тем, как я реализовал представления, поскольку я не передаю правильный идентификатор школы
5. @SkyFall спасибо! Глядя на ваш скриншот, я только что кое-что понял в вашей ошибке:
'('',)'
не похожи на целые числа. Вы уверены, что школы. идентификатор и country.id переменные шаблона существуют и являются целыми числами?
Ответ №2:
URL-адрес ‘schools’ нуждается в двух (2) аргументах. Вы передаете только один (1). В этом случае: schools.id
Django находит обратное совпадение только в том случае, если вы передаете правильное количество аргументов. В этом случае вы должны передать идентификатор страны И идентификатор школы.
Например {% url 'schools' country_id=country.id schools_id=schools.id %}
, если у вас также есть переменная country.
РЕДАКТИРОВАТЬ: '('',)'
в вашем сообщении об ошибке на самом деле не похожи на целые числа. Вы уверены, что переменные шаблона существуют и являются целыми числами?
Комментарии:
1. Привет, спасибо за ответ. это имеет смысл, я скопировал и вставил ваше предложение. по-прежнему получаю ошибку NoReverseMatch в /6/ Reverse для ‘schools’ с аргументами ключевого слова ‘{‘country_id’: 6, ‘schools_id’: «}’ не найдено. попробовано 1 шаблон (ы): [‘(?P<country_id>[0-9] )/(?P<schools_id>[0-9] )/$’]
2. @SkyFall — я добавил к своему ответу, чтобы решить проблему, с которой вы столкнулись с параметрами.