Почему я получаю ошибку без обратного совпадения

#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 — я добавил к своему ответу, чтобы решить проблему, с которой вы столкнулись с параметрами.