2012-02-09 22 views
5

Mam model, który jest zdefiniowany jako pokazany, który działa na kwerendę i pobiera listę obiektów, które muszą być umieszczone w odpowiednich komórkach tabeli. Oto odpowiednia część kodu.sposób renderowania zestawu kwerend do szablonu tabeli-django

class Location(models.Model): 
    x=models.IntegerField(null=True) 
    y=models.IntegerField(null=True) 
    z=models.CharField(max_length=5,null=True) 

    def __unicode__(self): 
     return self.z 

W ten bit I ma pobrać wszystkie obiekty i umieścić je w tabeli 2D w wierszach i kolumnach określonym przez X i Y, które object.If nie ma obiektu dla określonych transmisji (x, y), a następnie ten konkretny slot powinien być pusty w tabeli. To jest widok, który napisałem, aby spełnić te cele.

def gettable(request): 
    events=[] 
    for xdim in xrange(3): 
     xe=[] 
     for ydim in xrange(3): 
      object=[0] 
      object.append(Location.objects.filter(x=xdim,y=ydim)) 
      xe.append(object[-1]) 
      events.append(xe) 
    return render(request, 'scheduler/table.html', {'events':events}) 

Oto część html kodu

<table border="1"> 
    <th>Header 0</th> 
    <th>Header 1</th> 
    <th>Header 2</th> 
    {% for event in events %} 
    <tr> 
    {% for x in event %} <td>{{ x }}</td> 
    {% endfor %} 
    </tr> 
    {% endfor %} 
</table> 

mam do rozwiązania wielu problemów tutaj.

1. Mój kod dla widoków wcale nie jest elegancki (co jest złe, ponieważ wiem, że django oferuje mnóstwo rzeczy do radzenia sobie z takimi zadaniami), ponieważ definiuję zmienne specjalnie do przechodzenia w pętlę zamiast odbierania tych z (x, y) wartości obiektów bazy danych.

2. Otrzymuję dane wyjściowe w formacie [<Location: 21>], ale chcę je jako "21".

3.Jak wprowadzać puste komórki tam, gdzie nie ma żadnego obiektu dla danego (x, y).

4. Proszę zasugerować każdy inny możliwy sposób, dzięki któremu mój kod stanie się prostszy i ogólny.

Odpowiedz

14

Jeśli chcesz uprościć kod, chciałbym polecić aplikację django-tables2. Takie podejście może rozwiązać wszystkie problemy związane z generowaniem tabel.

jako dokumentacja NOK:

django-tables2 upraszcza toczenie zestawów danych w HTML tabele. Ma natywne wsparcie dla stronicowania i sortowania. Robi dla tabel HTML, co django.forms robi dla formularzy HTML. na przykład

Jego funkcje obejmują:

  • Wszelkie iterable może być źródłem danych, ale szczególne wsparcie dla querysets Django jest włączone.
  • Wbudowany interfejs użytkownika nie zależy od JavaScript.
  • Obsługa automatycznego generowania tabel w oparciu o model Django.
  • Obsługuje niestandardowe funkcje kolumn za pomocą podklasy.
  • Paginacja.
  • Sortowanie tabel w oparciu o kolumny.
  • Znacznik szablonu umożliwiający proste renderowanie do HTML.
  • Widok ogólny do użycia w Django 1.3.

Tworzenie tabeli jest tak proste, jak:

import django_tables2 as tables 

class SimpleTable(tables.Table): 
    class Meta: 
     model = Simple 

To być następnie wykorzystane w widoku:

def simple_list(request): 
    queryset = Simple.objects.all() 
    table = SimpleTable(queryset) 
    return render_to_response("simple_list.html", {"table": table}, 
           context_instance=RequestContext(request)) 

I wreszcie w szablonie:

{% load django_tables2 %} 
{% render_table table %} 

Ten przykład pokazuje jeden z najprostszych przypadków, ale d jango-tables2 może zrobić o wiele więcej! Aby uzyskać więcej informacji, sprawdź numer na stronie documentation.

Możliwe jest również użycie słownika zamiast zestawu pytań.

1

za punkt:

  1. IMO można uciec z tworzenia filtru niestandardowego lub znacznik i przy użyciu queryset.
  2. Musisz zdefiniować metodę __unicode__ (lub __string__), aby zwrócić żądaną pozycję.
  3. Jeśli wartość jest pusta lub element nie istnieje, renderowany wynik również będzie pusty.

HTH

1

Do punktu 2, dajesz każdą komórkę lista aniżeli pojedynczy obiekt, {{x.0}} powinien dać odpowiednią wartość, ale również sugeruje, że jesteś podchodzi do tego źle w logice widoku.

Powiązane problemy