在Django中过滤时出现未定义的错误

时间:2016-04-03 05:35:16

标签: python django filter

我正在尝试使用Django中的过滤器在州内的城市和城市中展示学校:

State Page
--- City
-----School
-----School

但是,当我尝试使用state__state_name模型字段进行过滤时,我一直收到一个未定义的(NameError)错误。 state_name模型字段包含状态的名称。美国所有50个州都在那里。

这是错误:

NameError: name 'state_state_name' is not defined

views.py:

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from django.shortcuts import get_object_or_404

from .models import School, State

class StateDetail(ListView):
    model = StateArticle
    template = 'state_detail.html'

    context_object_name = 'state_article'

    def get_context_data(self, **kwargs):
        context = super(StateDetail, self).get_context_data(**kwargs)
        context['school_list'] = School.objects.filter(address__city__state=state_state_name).order_by('city_name')
        return context

models.py

class Summary(models.Model):
    summary_name = models.CharField(max_length=55, default='')
    summary = models.TextField(max_length=3000, null=True)

    def __str__(self):
        return self.summary_name

class State(models.Model):
    state_name = models.CharField(max_length=20, default='')
    state_photo = models.ForeignKey(Photo, null=True)

    def __str__(self):
        return self.state_name

class City(models.Model):
    city_name = models.CharField(max_length=55, default='')
    city_photo = models.ForeignKey(Photo, null=True)
    state = models.ForeignKey(State, null=True)

    def __str__(self):
        return self.city_name

class Address(models.Model):
    street_address = models.CharField(max_length=100, default='')
    street_address2 = models.CharField(max_length=100, default='')
    city = models.ForeignKey(City, null=True)

    def __str__(self):
        return self.street_address

class School(models.Model):
    school_name = models.CharField(max_length=55, default='')
    address = models.ForeignKey(Address, null=True)
    professional_school = models.CharField(max_length=55, default='')
    address = models.ForeignKey(Address, null=True)
    contact = models.ForeignKey(Contact, null=True)
    school_summary = models.ForeignKey(Summary, null=True)
    school_photo = models.ForeignKey(Photo, null=True)

    def __str__(self):
        return self.school_name

class StateArticle(models.Model):
    title = models.CharField(max_length=69, default='')
    description = models.CharField(max_length=155, default='')
    state_article_summary = models.ForeignKey(Summary, null=True)
    slug = models.SlugField(max_length=69, null=True)
    published = models.BooleanField(default=False)
    draft = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def get_absolute_url(self):
        return reverse('state_detail', kwargs={'slug': self.slug})

    def __str__(self):
        return self.title

网址

from django.conf.urls import patterns, include, url

from .views import StateDetail

urlpatterns = [
    url(r'^(?P<slug>[-\w]+)/$', StateDetail.as_view(), name='state_detail'),

]

如何按城市过滤学校,然后按州过滤该城市?我正在慢慢学习如何使用django。我们非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

您的代码看起来像是从其他地方复制粘贴的,现在您希望我们让它适合您。请阅读ListView如何工作,代码中有几个问题。

  • 如果您要列出城市,则model中的View属性应为City,而不是StateArticle

  • urls.py中的命名参数名为slug,这是误导性的,因为StateCity或任何地方都没有任何标记其他相关模型。

  • 如果要在视图中过滤查询集,则会有一个名为get_queryset()的方法。默认情况下,返回所有记录,因此您要覆盖它,调用父项,然后从父项调用查询集上的filter()

最后是关于未定义变量的问题:

要使变量可用,您必须先声明它。因此,我们假设您在网址的参数slug中有州名。它将通过self.kwargs['slug']在视图中显示。因此,您希望首先使用它来获取State,然后您可以使用该对象来过滤您的查询集,例如。

# this is a silly implementation, but the variable has now what you need
state = State.objects.get(state_name=self.kwargs['slug'])
# if you insist on the variable from your code, here you go
state_state_name = state.state_name