2016-04-08 15 views
0

Ich habe versucht, dieses Problem beim Lernen von Django (Python) herauszufinden.Kinder in Eltern in Django-Vorlage sortieren

Ich möchte Kinderobjekte in ihre Eltern sortieren. Konkret möchte ich Städte in ihren jeweiligen Staat einordnen. Dann möchte ich, dass die Stadt in der Vorlage in ihrem korrekten Zustand angezeigt wird. Was ich suche, wie dies möchte:

Staat
--- Stadt
--- Stadt
--- Stadt

Edit: Ich habe es funktioniert etwas. Die Städte wiederholen sich jedoch in der Vorlage. Ich brauche nur jedes einzelne Display. Ich habe die Vorlage eingefügt, um zu sehen, ob mir jemand dabei helfen kann.

Nochmals vielen Dank.

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 %} 

Das hat mir seit einer Woche den Hintern getreten. Bitte erkläre es mir wie ich bin fünf. Ich schätze all Ihre Hilfe im Voraus.

Antwort

1

Ich denke, dass Sie eine Detailansicht verwenden möchten, die den Zustand darstellt, eher als eine Liste von Städten. Dies liegt daran, dass Ihre URL die Objektansicht eines Status darstellt.

So können Sie

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 

und dann die Vorlage (vereinfachtes Beispiel) wäre so einfach wie:

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

Für die URL mit Detailview zu arbeiten, und weil Sie nicht verwenden slug Als Feldname müssen Sie dem DetailView mitteilen, dass state_slug Ihr Slug ist. Vielleicht möchten Sie Ihrem Modell unique=True hinzufügen.

Hoffe, Sie können es von hier

+0

Ich werde es versuchen. Vielen Dank. – user2901792

+0

Ich bin ohne zu testen, also lassen Sie mich wissen, wenn es nicht funktioniert und ich werde es beheben – dkarchmer

+0

Ich habe es versucht. Ich bekomme jetzt diesen Fehler: Generische Detailansicht CityInStateView muss entweder mit einem Objekt pk oder einem Slug aufgerufen werden. – user2901792

Verwandte Themen