没有反向匹配URL django
我有这样一个场景: 模型没有反向匹配URL django,django,templates,hyperlink,views,reverse,Django,Templates,Hyperlink,Views,Reverse,我有这样一个场景: 模型 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
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'
观点
网址
以下是我在模板中链接的方式:
{% 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 %}
{%block main_content%}
{%if城市%}
{城市中城市的百分比%}
{%endfor%}
{%endif%}
{%endblock%}
有人能告诉我我做错了,帮我改正吗。提前感谢。城市详细信息url模式包括
状态。状态
,因此您需要在模板上下文中包含状态
在您的视图中,您可以使用get\u object\u或\u 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)
请注意,我已更改了城市列表,因此它仅显示您正在查看的状态中的城市
对实例和slug使用相同的变量名
state
不是一个好主意。最好重命名其中一个,例如将其重命名为state\u obj
或state\u slug
。如果您这样做,您必须确保更新URL、视图和模板以保持一致。state。在
标记中未定义state
。我认为把它改成城市。州应该这样做trick@gtlambert,我将标记中的state.state更改为city.state。但现在我得到了这个错误:找不到带有参数“(,“Auburn”)和关键字参数“{}”的'city_detail'的NoReverseMatch at/reviews/alabama/Reverse。尝试了0个模式:[]city.state.state
将执行此操作,尽管这是一个相当粗糙的过程@下面的阿拉斯代尔解决方案将更具吸引力robust@gtlambert事实上,我认为你使用city.state.state
的想法更好。使用state.state
可以在state\u detail
视图中工作,但是如果您在不同州的城市之间循环,那么city.state.state`更好。@Alasdair这很有意义。我只是不喜欢目前的命名惯例!类似于city.state.slug
的内容读起来更好感谢您的帮助。我感谢你的回答。但是,现在,我得到了一个404错误。哪个URL提供了404?example.com/reviews/state行state=get\u object\u或_404(state,state=state)
正在从数据库中获取状态,其中slug来自URL。如果数据库中不存在该状态,则应为404。您需要使用类似于example.com/reviews/alabama/
(假设您的数据库中有一个slug'alabama'
)的url。我使用的是example.com/reviews/alabama。这就是我得到404错误的地方。所有50个州都在我的数据库中。
NoReverseMatch at /reviews/alabama/
Reverse for 'city_detail' with arguments '('', 'Auburn')' and keyword arguments '{}' not found. 0 pattern(s) tried: []
{% 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 %}
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)