2016-04-01 8 views
0

Ich baue eine standortspezifische App. Was ich tun möchte, ist eine Liste der Schulen nach Stadt und Staat anzuzeigen. Die Seiten sind nach Bundesland geordnet. Auf den Staatsseiten werden Schulen angezeigt, die nach Städten sortiert sind.Wie kann ich in Django filtern, damit ich jedes Objekt in seine korrekte Eltern sortieren kann?

Staat
--- Stadt
------ Schule
--- Stadt
------ Schule

Ich kann den Zustand Seite erhalten die Liste der zum Anzeigen Städte sind in Ordnung. Aber anstatt Städte aus verschiedenen Staaten zu sortieren, erhalte ich eine Liste aller Städte, ohne dass sie in ihre korrekten Zustände sortiert werden. Ich kann auch nicht die Liste der Schulen in die richtige Stadt filtern. Die Städte und Schulen erscheinen in jedem Staat - auch die falschen.

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

Ich verstehe nicht, Ihre Modellstruktur. Kannst du bitte auch deine anderen Modelle posten? Ich glaube auch nicht, dass Sie 'default = ''' in einem 'ForeignKey'-Feld haben wollen - setzen Sie stattdessen einfach' null = True'. – yedpodtrzitko

+0

Veröffentlichen Sie sie jetzt. Vielen Dank für die Hinweise auf den ForeignKey. – user2901792

+0

Haben Sie versucht, das Template "regroup" zu erkunden? Scheint so, als könnte es lösen, was du brauchst. https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#regroup –

Antwort

2

Es ist nicht wirklich eine Antwort, aber es war zu lang, um es in den Kommentar zu schreiben.

Ich mag das SchoolList Modell überhaupt nicht. Es verletzt Normal Forms, und es wird dich früher oder später beißen. Die Modelle sollten die reale Welt repräsentieren. Wenn Sie also eine Postleitzahl haben, existiert sie nicht einfach so. Es ist mit einer Stadt verbunden. Und wenn Sie eine Stadt haben, ist sie mit einem Staat verbunden. So sollten die Modelle wie folgt aussehen:

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) 
    ... 

Nun, wenn Sie Adresse haben, können Sie eine ForeignKey(Zip) es haben wollen. Auf diese Weise haben Sie transitiv definiert Zip, City und State dort, so dass Sie (oder mehr wie sollten) entfernen Sie sie aus dem SchoolList Modell. Dann, wenn Sie die Schulen, die von Staat filtern möchten, können Sie es auf diese Weise tun:

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

Vielen Dank. Ich dachte, das wäre der richtige Weg. Aber ich konnte nicht herausfinden, dass es funktioniert. Ich habe immer noch den Dreh raus. Nochmals vielen Dank. – user2901792

Verwandte Themen