2016-04-08 4 views
0

Django(Python)を学んでいるときにこの問題を解こうとしています。djangoのテンプレートで親を子にソート

子オブジェクトを親にソートしたいと思います。具体的には、都市をそれぞれの状態に分類したいと思います。次に、都市を正しい状態でテンプレートに表示します。私はこのような希望を探しています何:


---市
---市
---市

編集:私はそれが多少働いてんです。しかし、都市はテンプレートで繰り返されています。私は一度だけそれぞれを表示する必要があります。誰かが私を助けてくれるかどうかを調べるために、テンプレートを含めました。

もう一度おねがいします。

models.py

class State(models.Model): 
    state_name = models.CharField(max_length=20, default='') 
    state_slug = models.SlugField() 
    state_image = models.ForeignKey(Image, null=True) 
    state_summary = models.TextField(null=True) 

    def __str__(self): 
     return self.state_slug 

class City(models.Model): 
    city_name = models.CharField(max_length=55, default='') 
    city_slug = models.SlugField() 
    state_image = models.ForeignKey(Image, null=True) 
    school_image = models.ForeignKey(Image, null=True, related_name='+') 
    state = models.ForeignKey(State, null=True) 
def __str__(self): 
    return self.city_slug 

views.py

class CityInStateView(ListView): 
    model = City 

    context_object_name = 'city_in_state_list' 

    def get_context_data(self, **kwargs): 
     context = super(CityInStateView, self).get_context_data(**kwargs) 
     city = City.objects.all() 
     state = State.objects.get(state_slug=self.kwargs['state_slug']) 
     context['city_list'] = City.objects.filter(state=state).order_by('city_name') 
     return context 

urls.py

urlpatterns = [ 
    url(r'^$', SchoolIndexView.as_view(), name='school_index'), 
    url(r'^(?P<state_slug>[\w-]+)/$', CityInStateView.as_view(), name='state_index'), 
] 

template.html

{% block main_content %} 
<div class="row body"> 
    <div class="main_content"> 
     <div class="row"> 

      <div class="medium-12 columns small-centered"> 
       <div class="feature_wrapper"> 
        {% load cloudinary %} 
        <header class="page_header"> 
         <div class="row"> 
          <div class="medium-12 columns">Top bar</div> 
         </div> 
        </header> 
        <div class="search"> 
         <div class="row"> 
          <div class="medium-12 columns">Search bar</div> 
         </div> 
        </div> 
        {% if city_in_state_list %} 
        {% for city in city_in_state_list %} 
        <section class="hero"> 
         {% cloudinary city.state_image.image format="jpg" crop="fill" %} 
         <p class="photo-caption"> 
          {{ city.state_image.image_name }} by {{ city.state_image.image_author }} via {{ city.state_image.image_source }} | {{ city.state_image.image_license }} 
         </p> 
        </section> 
        <section class="summary"> 
         <p>{{ city.state.state_summary }}</p> 
        </section> 
        <div class="row"> 
         <div class="medium-12 columns listicle"> 
          <div class="demo_wrapper"> 
           <div class="long_ad_box"> 
           <img src="http://placehold.it/728x90"> 
          </div> 
         </div> 
         <div class="state_name"> 
          <h2 class="headline">Nursing Schools in {{ city.state.state_name }}</h2> 
         </div> 
         {% if city_list %} 
          {% for school in city_list %} 
          <h2 style="text-align: left";>{{ school.city_name }}</h2> 
          <div class="school_image"> 
           {% cloudinary city.school_image.image format="jpg" crop="fill" %} 
          </div> 
          {% endfor %} 
         {% endif %} 
        </div> 
       </div> 
      </div> 
     </div> 
     {% endfor %} 
    {% endif %} 
</div>         
{% endblock %} 

これは1週間私のお尻を蹴ってきました。私のように私に説明してください。私はあなたの助けをすべて前もって感謝します。

答えて

1

都市のリストではなく、状態を表すDetailViewを使用したいと思います。これは、URLが状態のオブジェクトビューを表すためです。

ので、することができます

class CityInStateView(generic.DetailView): 
    model = State 
    template_name = 'template.html' 
    slug_field = 'state_slug' 

    def get_context_data(self, **kwargs): 
     context = super(CityInStateView, self).get_context_data(**kwargs) 
     context['state'] = self.object 
     context['city_list'] = self.object.city_set.all().order_by('city_name') 
     return context 

してからテンプレート(簡略化した例では)のような単純なものになります。URLはDetailViewで動作するために

<h1>{{ state.state_name }}</h1> 
{% for city in city_list %} 
    <p>{{ city.city_name }}</p> 
{% endfor %} 

、あなたが使用していなかったので、 slugをフィールド名として使用するには、DetailViewにstate_slugがあなたのスラッグであることを伝える必要があります。モデルにunique=Trueを追加することができます。

こちらからどうぞよろしくお願いします。

+0

試してみます。ありがとうございました。 – user2901792

+0

テストなしでコーディングしているので、うまく動作しない場合はお知らせください。 – dkarchmer

+0

私は試しました。私は今このエラーが発生しています:一般的な詳細ビューCityInStateViewは、オブジェクトpkまたはスラッグのいずれかで呼び出さなければなりません。 – user2901792

関連する問題