2010-11-22 1 views
0

Ich versuche eine 'Sortierung nach Status' Funktion zu erstellen, die zB alle Projekte mit dem Status = 'Quote' anzeigt. Ich habe ein bisschen Mühe herauszufinden, wie ich das machen soll.Filterung des Projektstatus

Hier ist meine models.py (vereinfacht)

class Project(models.Model): 
client = models.ForeignKey(Clients, related_name='projects') 
created_by = models.ForeignKey(User, related_name='created_by') 


#general information 
API_id = models.IntegerField(max_length=10, verbose_name='aC ProjectID', null=True, blank=True) 
proj_name = models.CharField(max_length=255, verbose_name='Project Name') 
... 
notes = models.TextField(verbose_name='Notes', null=True, blank=True) 


class Status(models.Model): 
project = models.ForeignKey(Project, related_name='status') 
value = models.CharField(max_length=20, choices=STATUS_CHOICES, verbose_name='Status') 
date_created= models.DateTimeField(auto_now=True) 

Ich habe kein Problem zu tun separate Ansichten in der views.py aber es hat eine effizientere Art und Weise dann Erstellen mehrerer Ansichten sein.

Hier ist meine Ansicht nur Zitat Status Projekte zu zeigen:

@login_required 
def quote_projects(request): 
project_list = Project.objects.filter(status__value__exact='Q') 
return render_to_response('project/index.html',{'project_list': project_list, 'user':user}, context_instance=RequestContext(request)) 

Jede Hilfe wäre sehr dankbar!

Danke,

Steve

+0

Es ist nicht ganz klar, was dein Problem ist. Versuchen Sie, eine Ansicht zu erstellen, die einen beliebigen Statuswert annimmt und Rezepte mit diesem Wert anzeigt? Wenn ja, um welches Bit geht es dir nicht? –

Antwort

0

Das ist nicht wie Sortierung sieht; Das sieht nach einem Filterproblem aus.

Wenn dies der Fall ist, müssen Sie entscheiden, ob Ihre Filterschlüssel als Lesezeichen verwendet werden sollen oder ob sie dynamisch sind und von einer Basis ausgehen sollen. Sie entscheiden, ob Sie URLs als Sortierschlüssel oder CGI-Argumente verwenden möchten.

In jedem Fall ist der Handler ähnlich. Zum ersten, würden Sie in Ihrem urls.py erstellen:

url('/projects/(?P<status>\d+)/', quote_projects), 

Und Ihre Projekte aussehen könnte:

@login_required 
def quote_projects(request, status): 
    status = dict(STATUS_CHOICES).get(status, None) 
    if not status: 
     raise Http404 

    return render_to_response(
     'project/index.html', 
     {'projects': Projects.objects.filter(status__value__exact = status)}, 
     context_instance=RequestContext(request)) 

Sie können als ‚Nutzer‘ müssen überhaupt; Dies wird automatisch vom RequestContext für Sie bereitgestellt und ist dadurch sichergestellt, dass Sie diese Methode login_required angegeben haben. Jetzt können Sie sich auf „http://example.com/projects/quoted“

Für CGI-Argumente, Ihre urls.py Linie sieht wie folgt aus:

url('/projects/', quote_projects), 

Und Ihre Funktion sieht wie folgt aus:

@login_required 
def quote_projects(request): 
    status = request.GET.get('status', None) 
    status = dict(STATUS_CHOICES).get(status, None) 
    if not status: 
     raise Http404 

    return render_to_response(
     'project/index.html', 
     {'projects': Projects.objects.filter(status__value__exact = status)}, 
     context_instance=RequestContext(request)) 

Und jetzt würde Ihre URL sein: http://example.com/project/?status=quoted

+0

wow danke Elf, das hat mir sehr geholfen! – TheLifeOfSteve

+0

Hey Elf, ich bekomme ein "Caught NoReverseMatch beim Rendern: Reverse für 'view-status' mit Argumenten '()' und Schlüsselwortargumenten '{}' nicht gefunden. ' wenn Sie versuchen, die Vorlage zu laden. Irgendwelche Vorschläge? – TheLifeOfSteve

+0

Das sieht wie ein anderes Problem aus. (Ich habe auch bemerkt, dass ich der Funktion urls.py den falschen Namen gegeben habe; sie wird durchweg als "quote_projects" bezeichnet, nicht als "Projekte", wie ich es im Original getan habe. Was Ihre Fehlermeldung sagt, ist, dass Ihre Funktion, "Status anzeigen", einen Status irgendeiner Art benötigt, um korrekt zu funktionieren. –