2016-04-01 9 views
0

私は位置特定アプリケーションを構築しています。私がしたいことは、都市と州ごとに学校リストを表示することです。ページは州ごとに整理されています。次に、州のページには都市別にソートされた学校が表示されます。それぞれのオブジェクトを正しい親にソートできるように、どのようにしてDjangoでフィルタリングできますか?


---市
------学校
---市
------学校

私はのリストを表示するには、状態のページを取得することができます都市はまあまあです。しかし、異なる州の都市を分類するのではなく、正しい状態に分類されていないすべての都市のリストを取得します。私はまた、適切な都市にフィルタするための学校のリストを取得することはできません。都市や学校はすべての州に表示されます - 間違った都市も表示されます。

models.py

class SchoolList(models.Model): 
    school_list_image = models.ForeignKey(Photo, default='') 
    school_list_state = models.ForeignKey('place.state', default='') 
    school_list_city = models.ForeignKey('place.city', default='') 
    school_list_zip_code = models.ForeignKey('place.zip', default='') 
    school_list_address = models.ForeignKey('place.address', default='') 
    school_list_contact = models.ForeignKey(Contact) 
    school_list_university = models.ForeignKey('place.university', default='') 
    school_list_professionalschool = models.ForeignKey('place.professionalschool', default='') 
    school_list_summary = models.ForeignKey(Summary, default='')  

    def __str__(self): 
     return self.school_list_university.university_name 

class State(models.Model): 
    state_name = models.CharField(max_length=20, default='') 
    state_abbreviation = models.CharField(max_length=2, default='') 

    class Meta: 
     ordering = ['-state_name'] 

    def __str__(self): 
     return self.state_name 

class City(models.Model): 
    city_name = models.CharField(max_length=55, default='') 

    class Meta: 
     ordering = ['-city_name'] 
     verbose_name_plural = 'Cities' 

    def __str__(self): 
     return self.city_name 

class Zip(models.Model): 
    zipcode = models.CharField(max_length=15, default='') 

    class Meta: 
     ordering = ['-zipcode'] 

    def __str__(self): 
     return self.zipcode 

class University(models.Model): 
    university_name = models.CharField(max_length=55, default='') 
    university_summary = models.CharField(max_length=255, default='') 
    university_image = models.ForeignKey(Photo, default='') 

    class Meta: 
     verbose_name_plural = 'Universities' 
     ordering = ['-university_name'] 

    def __str__(self): 
     return self.university_name 

class ProfessionalSchool(models.Model): 
    school_name = models.CharField(max_length=100, default='') 

    class Meta: 
     verbose_name_plural = 'Professional Schools' 
     ordering = ['-school_name'] 

    def __str__(self): 
     return self.school_name 

class Address(models.Model): 
    address = models.CharField(max_length=100, default='') 
    address2 = models.CharField(max_length=100, default='', blank=True) 
    address3 = models.CharField(max_length=100, default='', blank=True) 

    class Meta: 
     verbose_name_plural = 'Addresses' 

    def __str__(self): 
     return self.address 

views.py

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

    context_object_name = 'article_state_list' 

    def get_context_data(self, **kwargs): 
     context = super(StateDetail, self).get_context_data(**kwargs) 
     context['school_list'] = SchoolList.objects.all().order_by('school_list_city') 
     return context 

urls.py

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

template.html

{% for school in school_list %} 
<h2>{{ school.school_list_city.city_name }}</h2> 
<div class="school_image"> 
    {% cloudinary school.school_list_image.image format="jpg" crop="fill" %} 
</div> 
<div class="demo_wrapper"> 
    <div class="row"> 
     <div class="medium-4 columns"> 
      <div class="school_data_wrapper"> 
       <h3>{{ school.school_list_university.university_name }}</h3> 
       <h4 style="margin-bottom: 10px;"> 
        {{ school.school_list_professionalschool.school_name }}  </h4> 
       <h4>{{ school.school_list_address.address }}</h4> 
       <h4>{{ school.school_list_city.city_name }}, {{ school.school_list_state.state_name }} {{ school.school_list_zipcode.zipcode }}</h4>             
       <h4><a href="tel:555555555">{{ school.school_list_contact.telephone }}</a> 
       </h4> 
       <h4><a href="" rel="external nofollow"> 
        {{ school.school_list_contact.website }}</a> 
       </h4> 
      </div> 
     </div> 
     <div class="medium-8 columns"> 
      <h3>Summary</h3> 
      <p style="padding: 20px 0;">{{ school.school_list_summary.summary }}<a href="link to university detail page">...more</a></p> 
     </div> 
    </div> 
</div> 
+0

私はあなたのモデル構造を理解しません。あなたの他のモデルもお寄せください。また、 'ForeignKey'フィールドに' default = '' 'をつけたいとは思っていません。代わりに' null = True'を設定してください。 – yedpodtrzitko

+0

今すぐ投稿するForeignKeyのヘッドアップに感謝します – user2901792

+0

'regroup'テンプレートタグを探そうとしましたか?それはあなたが必要とするものを解決するかもしれないようです。 https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#regroup –

答えて

2

それは本当に答えではありませんが、コメントに入れるには長すぎました。

SchoolListモデルのようなものはまったくありません。それはNormal Formsに違反しています。それはあなたを遅かれ早かれあなたに噛ませるでしょう。モデルは現実の世界を表すはずです。だから、郵便番号を持っているとき、それはちょうどそのように存在しません。それは都市に関連しています。そしてあなたが都市を持っているとき、それは国家に関係しています。だから、モデルは次のようになります。

class State(models.Model): 
    state_name = models.CharField(max_length=20, default='') 
    state_abbreviation = models.CharField(max_length=2, default='') 

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

class Zip(models.Model): 
    zipcode = models.CharField(max_length=15, default='') 
    city = models.ForeignKey(City) 

class Address(models.Model): 
    zip = models.ForeignKey(Zip) 
    ... 

、あなたはアドレスを持っているとき、あなたはそこにForeignKey(Zip)を持っていると思います。このようにしてZip,CityStateを定義しているので、モデルから削除することができます(となります)。 あなたが状態で学校をフィルタするときに、あなたはこのようにそれを行うことができます。

SchoolList.objects.filter(address__zip__city__state=state_object) 
+0

ありがとうございます。私はそれが正しいことだと思った。しかし、私はそれを動作させるために把握できませんでした。私はまだこれのハングを取得しています。もう一度大変ありがとうございます。 – user2901792

関連する問題