没有反向匹配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)