没有 ReverseMatch URL django
No ReverseMatch URL django
我有一个看起来像这样的场景:
型号
from django.db import models
from django.core.urlresolvers import reverse_lazy, reverse
class State(models.Model):
short_name = models.CharField('Abbreviation', max_length=2)
state = models.SlugField('State Name', max_length=20)
def __str__(self):
return self.state
def get_absolute_url(self):
return reverse('state_list', kwargs={'state': self.state})
class City(models.Model):
state = models.ForeignKey(State)
city = models.CharField('City', max_length=100)
class Meta:
verbose_name = 'City'
verbose_name_plural = 'Cities'
def __str__(self):
return self.city
class School(models.Model):
name = models.CharField(max_length=69, default='')
def __str__(self):
return self.name
class Meta:
verbose_name = 'School'
verbose_name_plural = 'Schools'
观看次数
from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from .models import School, City, State
def reviews_index(request):
state_list = State.objects.all()
context = {'states': state_list}
return render(request, 'reviews/reviews_index.html', context)
def state_detail(request, state=None):
city_list = City.objects.order_by('city')
context = {'cities': city_list}
return render(request, 'reviews/state_detail.html', context)
def city_detail(request, state=None, city=None):
school_list = School.objects.all()
context = {'schools': school_list}
return render(request, 'reviews/city_detail.html', context)
网址
from django.conf.urls import url, include
from . import views
app_name = 'reviews'
urlpatterns = [
url(r'^$', views.reviews_index, name='reviews_index'),
url(r'^(?P<state>[a-z]+)/$', views.state_detail, name='state_detail'),
url(r'^(?P<state>[a-z]+)/(?P<city>[a-z]+)/$', views.city_detail, name='city_detail'),
]
但是,当我尝试从 state_detail 模板创建 link 到 city_detail 模板时,出现此错误:
NoReverseMatch at /reviews/alabama/
Reverse for 'city_detail' with arguments '('', 'Auburn')' and keyword arguments '{}' not found. 0 pattern(s) tried: []
这就是我在模板中link的方式:
{% block main_content %}
<div class="content">
<div class="row">
{% if cities %}
{% for city in cities %}
<div class="medium-3 column">
<a href="{% url 'city_detail' state.state city.city %}">{{ city.city }}</a>
</div>
{% endfor %}
{% endif %}
</div>
</div>
{% endblock %}
谁能告诉我我做错了并帮我改正。提前致谢。
city_detail
url 模式包含 state.state
,因此您需要在模板上下文中包含状态。
在您看来,您可以使用 get_object_or_404
使用 slug 获取状态。
def state_detail(request, state=None):
state = get_object_or_404(State, state=state)
city_list = City.objects.filter(state=state).order_by('city')
context = {'cities': `city_list`, 'state': state}
return render(request, 'reviews/state_detail.html', context)
请注意,我已经更改 city_list,因此它只显示您正在查看的州的城市。
为实例和 slug 使用相同的变量名 state
并不是一个好主意。重命名其中一个是个好主意,例如state_obj
或 state_slug
。如果这样做,您必须确保更新 urls、视图和模板以保持一致。
我有一个看起来像这样的场景:
型号
from django.db import models
from django.core.urlresolvers import reverse_lazy, reverse
class State(models.Model):
short_name = models.CharField('Abbreviation', max_length=2)
state = models.SlugField('State Name', max_length=20)
def __str__(self):
return self.state
def get_absolute_url(self):
return reverse('state_list', kwargs={'state': self.state})
class City(models.Model):
state = models.ForeignKey(State)
city = models.CharField('City', max_length=100)
class Meta:
verbose_name = 'City'
verbose_name_plural = 'Cities'
def __str__(self):
return self.city
class School(models.Model):
name = models.CharField(max_length=69, default='')
def __str__(self):
return self.name
class Meta:
verbose_name = 'School'
verbose_name_plural = 'Schools'
观看次数
from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from .models import School, City, State
def reviews_index(request):
state_list = State.objects.all()
context = {'states': state_list}
return render(request, 'reviews/reviews_index.html', context)
def state_detail(request, state=None):
city_list = City.objects.order_by('city')
context = {'cities': city_list}
return render(request, 'reviews/state_detail.html', context)
def city_detail(request, state=None, city=None):
school_list = School.objects.all()
context = {'schools': school_list}
return render(request, 'reviews/city_detail.html', context)
网址
from django.conf.urls import url, include
from . import views
app_name = 'reviews'
urlpatterns = [
url(r'^$', views.reviews_index, name='reviews_index'),
url(r'^(?P<state>[a-z]+)/$', views.state_detail, name='state_detail'),
url(r'^(?P<state>[a-z]+)/(?P<city>[a-z]+)/$', views.city_detail, name='city_detail'),
]
但是,当我尝试从 state_detail 模板创建 link 到 city_detail 模板时,出现此错误:
NoReverseMatch at /reviews/alabama/
Reverse for 'city_detail' with arguments '('', 'Auburn')' and keyword arguments '{}' not found. 0 pattern(s) tried: []
这就是我在模板中link的方式:
{% block main_content %}
<div class="content">
<div class="row">
{% if cities %}
{% for city in cities %}
<div class="medium-3 column">
<a href="{% url 'city_detail' state.state city.city %}">{{ city.city }}</a>
</div>
{% endfor %}
{% endif %}
</div>
</div>
{% endblock %}
谁能告诉我我做错了并帮我改正。提前致谢。
city_detail
url 模式包含 state.state
,因此您需要在模板上下文中包含状态。
在您看来,您可以使用 get_object_or_404
使用 slug 获取状态。
def state_detail(request, state=None):
state = get_object_or_404(State, state=state)
city_list = City.objects.filter(state=state).order_by('city')
context = {'cities': `city_list`, 'state': state}
return render(request, 'reviews/state_detail.html', context)
请注意,我已经更改 city_list,因此它只显示您正在查看的州的城市。
为实例和 slug 使用相同的变量名 state
并不是一个好主意。重命名其中一个是个好主意,例如state_obj
或 state_slug
。如果这样做,您必须确保更新 urls、视图和模板以保持一致。