2009-09-27 17 views
7

Dzień drugi mojego nowego życia z Django, proszę wybaczyć prostotę mojego pytania.Nowość: Django: dodawanie wyników do Queryset przed przekazaniem do szablonu

Mam istniejącej tabeli dB (dostęp tylko do odczytu), że z powodzeniem wyświetlaną zawartość na stronie internetowej za pomocą adresów URL, widoki, modele i wszystkie te dobre rzeczy.

Wyzwanie, które mam, to tabela, która nie zawiera wszystkich informacji, które muszę wyświetlić. Tabela zawiera wyniki testu z kolumnami, sampletime, samplevalue, sampleresult. Muszę wyświetlać różne dane w oparciu o to, co obliczam z tych kolumn.

mój koniec celem jest, aby wyświetlić te informacje jako wykres szeregów czasowych z wykorzystaniem flotr. Na razie Id być szczęśliwy po prostu zrzucić do potrzebnych danych do tabeli na stronie internetowej. (Więc mogę wizualizować dane wynikowe)

Co Id jak przejść do szablonu jest

  • jssampletime (obiekt sampletime datetime konwertowane do javascript epoki ms)
  • resultValue (rolling sumę + - z samplevalue na podstawie tego, czy sampleresult było dobre lub złe)

jestem zadowolony z tworzeniem jssampletime i resultva lue za pomocą funkcji def. Zakładam, że dodałabym te funkcje do views.py

Domyślam się, co muszę zrobić iteracji na querySet w views.py i przechowywać wyniki na liście słowników, które przekazuję do szablonu. Coś takiego (kod nie testowany).

views.py

# views.py 
# Sudo code to assit in asking the question 
from django.shortcuts import render_to_response 
from thing.reporter.models import Samples 

def _datetime_to_js(sampletime): 
    #.. date conversion epoch magic 
    return jsd_result 

def _rolling_sum(samplevalue,sampleresult): 
    #.. summing magic 
    return sum_result 

def dumptable(request): # The def that is called by urls.py 
    object_list = Samples.objects.all() 

    list_for_template = [] 
    for row in object_list: 
     jssampletime = _datetime_to_js(row.sampletime) 
     resultvalue = _rolling_sum(row.samplevalue,row.sampleresult) 
     list_for_template.append({'jssampletime':jssampletime,'resultvalue':resultvalue}) 

    return render_to_response('tabledump.html', {'result_list': list_for_template}) 

tabledump.html

# tabledump.html template 
{% block content %} 
    <h2>Results dumped to page for testing</h2> 
    <ul> 
    <table> 
    {% for result in result_list %} 
     <tr> 
     <td>{{ result.jssampletime }}</td> 
     <td>{{ result.resultvalue }}</td> 
     </tr> 
    {% endfor %} 
    </table> 
    </ul> 
{% endblock %} 

myślę, że to będzie działać, ale nie jestem pewien, czy to jest droga Django MVC.

Czy to prawda, że ​​ja

  • obliczyć wynik muszę w views.py przez interating nad wyniku queryset?
  • przekazać mój wynik szablonu jako listy dict (to queryset ponad to)?

Chyba szukam wskazówek dotyczących kierunku i kodu. Czy jestem na dobrej drodze? Czy istnieje lepszy sposób?

Odpowiedz

15

Jeśli informacje które jest wyświetlane w modelu dlaczego nie dodać Właściwości/metod modelu, aby wyświetlić wszelkie informacje trzeba z niej wydostać? Następnie możesz przekazać rzeczywistą listę modeli/zestaw zapytań do szablonu i wywołać metody jako właściwości.

np.

class MyModel(models.Model): 
    model_field = models.CharField(max_length=255) 

    @property 
    def calculated_field(self): 
     return self._do_calculation(self.model_field) 

Jeśli potrzebujesz dostępu do zmiennych stanu w swojej pętli, nie zapomnij, że możesz dołączyć dowolną właściwość do obiektu Pythona. To może być bardzo przydatne.Więc w widoku można mieć coś takiego:

for row in object_list: 
    # update some variable we want to use in the template 
    row.newly_added_field = run_calculation(row, somevariable) 

Oba te mogą następnie być dostępne w szablonie:

{% for result in result_list %} 
    <tr> 
    <!-- some stuff that displays the model directly --> 
    <td>{{ result.calculated_field}}</td> 
    <td>{{ result.newly_added_field}}</td> 
    </tr> 
{% endfor %} 
+0

doskonała. Twoja odpowiedź rzuci więcej światła na modele i zestawy zapytań. Zaczynam teraz robić to Django. Małe kroki. Mam teraz dane potrzebne do wyświetlenia na podstawowej stronie internetowej. Dzięki Cory, dziewięciolatek –

+0

pewna rzecz, cieszę się, że pomogło. nie zapomnij, że możesz zaakceptować odpowiedź ...;) – Cory

Powiązane problemy