Anonym5656 Skrevet 13. januar 2009 Del Skrevet 13. januar 2009 Jeg har en model som "Oppdrag" og en som heter "Timer". Et oppdrag har mange timer da man på et oppdrag kan registrere timer og hvor mange timer man har brukt(sammen med beskrivelse osv). Nå vil jeg at django skal summere opp alle "Timer.antall_timer" som hører til "Oppdrag" og vise de i list_display til "Oppdrag". Hvordan kan jeg gjøre dette? Regner med at det er en ganske basic python funksjon kanskje, men jeg er veldig nybegynner på både python og django. Lenke til kommentar
Terrasque Skrevet 15. januar 2009 Del Skrevet 15. januar 2009 (endret) bruker du ForeignKey fra Timer() til Oppdrag() ? isåfall kan du bruke aktivtOppdrag.timer_set.all for å få en liste over alle timer som tilhører oppdraget. man har også .count istedet for .all for å få en integer med nummer av timer. I tillegg kan man ta Timer.objects.filter(oppdrag=aktivtoppdrag) for å få alle timer knyttet til et oppdrag. Se for øvrig http://docs.djangoproject.com/en/dev/topic...y-relationships Endret 15. januar 2009 av Terrasque Lenke til kommentar
Anonym5656 Skrevet 16. januar 2009 Forfatter Del Skrevet 16. januar 2009 Ja, jeg bruker ForeignKey på Timer() som peker på et Oppdrag(). Hvordan kan jeg legge inn Timer.objects.filter(oppdrag=aktivtoppdrag)? Lage en funksjon i view? Eller admin.py? Tror dette hadde vært en bra løsning der hvor alle timene er listet opp. Lenke til kommentar
Terrasque Skrevet 16. januar 2009 Del Skrevet 16. januar 2009 Spørsmålet er, hvor skal du bruke det? Hvis det er i template kan du ta {% for time in oppdrag.timer_set.all %} {{ time.id }}<br /> {% endfor %} Hvis det er i view så kan du bruke begge forslagene. For admin.py så må du se på inline på siden http://docs.djangoproject.com/en/dev/ref/contrib/admin/ Lenke til kommentar
Anonym5656 Skrevet 23. januar 2009 Forfatter Del Skrevet 23. januar 2009 Jeg vil nok ha det på oversikten over alle "timer"(i admin interfacet), slik at jeg kan filtrere ut et oppdrag over alle timene, så kun timene for det oppdraget blir listet opp. Jeg prøvde med list_filter = [oppdrag], men da det kom ikke opp noe ekstra filtrering i oversikten over timene. Ikke engang en feilmelding. Lenke til kommentar
Terrasque Skrevet 25. januar 2009 Del Skrevet 25. januar 2009 (endret) http://docs.djangoproject.com/en/dev/ref/c...eladmin-objects - Du kan legge Timer modellen in som inline av den andre modellen. Ellers er det letteste alternativet å skrive en view for det Endret 25. januar 2009 av Terrasque Lenke til kommentar
Anonym5656 Skrevet 25. januar 2009 Forfatter Del Skrevet 25. januar 2009 Men kan jeg skrive en view for admingrensesnittet? Eller blir den viewen helt uavhengig av admingrensesnittet? Lenke til kommentar
Terrasque Skrevet 27. januar 2009 Del Skrevet 27. januar 2009 Den lette løsningen er å skrive en view utenfor admin grensesnittet. Du kan lage egne views til admin grensesnittet, men det er en god del mer komplisert. Lenke til kommentar
Anonym5656 Skrevet 31. januar 2009 Forfatter Del Skrevet 31. januar 2009 (endret) Jeg endte opp med å skrive en view, og har fått listet opp antall timer med en loop: {% for time in oppdrag.timeliste_set.all %} <li>{{ time.antall_timer }}</li> {% endfor %} Men tilbake til det med å summere opp, jeg så nevnte du oppdrag.timeliste_set.count. Men jeg må vel på en eller annen måte si hva han skal summere opp i timeliste-tabellen? Altså time.antall_timer. Forresten, tusen takk for hjelpen så langt! Hadde nok ellers gitt opp for en stund siden. Endret 31. januar 2009 av Gakkakk Lenke til kommentar
Terrasque Skrevet 3. februar 2009 Del Skrevet 3. februar 2009 (endret) .count vil bare gi antall entries i QuerySet'et. Se på http://docs.djangoproject.com/en/dev/ref/m.../querysets/#id8 (Men det er i django 1.1 vel å merke) - Spesielt Count der. så.. Hvis jeg har forstått doc riktig, bør det bli oppdrag.timeliste_set.antall_timer__count sånn ca. Men det er i Django 1.1, som vel er på dev stadiet enda. Alternativet er å summere det i view funksjonen for siden. c = 0 for time in timer: c = c + time.antall_timer Send da c over til template'n, og bruk den der. Edit: Ta en god titt på http://docs.djangoproject.com/en/dev/ forresten Er veldig lett å slå opp i når man blir vant med strukturen Endret 3. februar 2009 av Terrasque Lenke til kommentar
Anonym5656 Skrevet 5. februar 2009 Forfatter Del Skrevet 5. februar 2009 (endret) Den koden for å summere timer, den må ligge i en funksjon ikke sant? Skal denne funksjonen ligge i View'en da? Blir det riktig å tenke noe slikt? def summerTimer(): c = 0 for time in timer: c = c + time.antall_timer Og deretter sende c til templaten? Og blir hvor tar den egentlig timer fra? time-row'en i Oppdrag databasen? Endret 5. februar 2009 av Gakkakk Lenke til kommentar
Terrasque Skrevet 6. februar 2009 Del Skrevet 6. februar 2009 (endret) Jepp, det må ligge i en view (eller du kan lage templatetag.. men view er enklere). timer henter du jo ut på en eller annen måte.. Eksempel kode for å hente timer for et oppdrag: def timesummary(request, id) oppdrag = Oppdrag.objects.get(id=id) timer = Timer.objects.filter(oppdrag=oppdrag) c = 0 for time in timer: c = c + time.antall_timer return render_to_response('template.html', { 'c':c, 'timer': timer, 'oppdrag':oppdrag}) 'id' er da prosjekt id som hentes fra url via urls.py Edit: Kom på en annen mulighet. Du kan overskrive save() for Timer modellen, og legge inn kode for å oppdatere et felt i Oppdrag modellen. La meg se.. def save(self, force_insert=False, force_update=False): if not self.id: #Er det en ny instance som lagres? self.oppdrag.antall_timer = self.oppdrag.antall_timer + self.antall_timer super(Timer, self).save(force_insert, force_update) # Fortsett med lagring Er ikke sikker på at det vil virke (pga foreignkey), og den vil ikke oppdatere når et Timer objekt endres eller slettes. Du kan også overskrive delete() på modellen for å få oppdatert ved det. Du kan også se på signals : http://www.mercurytide.co.uk/news/article/django-signals/ - men det har jeg ikke fått sett på selv, så kan ikke gi så mye hjelp der. Endret 6. februar 2009 av Terrasque Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå