我正在尝试使用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。我们非常感谢您提供的任何帮助。
答案 0 :(得分:0)
您的代码看起来像是从其他地方复制粘贴的,现在您希望我们让它适合您。请阅读ListView如何工作,代码中有几个问题。
如果您要列出城市,则model
中的View
属性应为City
,而不是StateArticle
。
urls.py
中的命名参数名为slug
,这是误导性的,因为State
或City
或任何地方都没有任何标记其他相关模型。
如果要在视图中过滤查询集,则会有一个名为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