2010-11-22 3 views
0

J'essaie de créer une fonction 'trier par statut' qui montre, par exemple .. tous les projets avec le statut = 'quote'. J'ai un peu de mal à comprendre comment je devrais m'y prendre.Filtrage de l'état du projet

Voici mon models.py (simplifié)

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) 

Je n'ai pas de problème à faire des vues séparées dans le views.py, mais il doit y avoir un moyen plus efficace puis créer plusieurs vues.

Voici mon avis pour ne montrer que des projets d'état de citation:

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

Toute aide serait grandement appréciée!

Merci,

Steve

+0

On ne sait pas exactement ce que votre problème. Essayez-vous de créer une vue qui prendra n'importe quelle valeur de statut et affichera des prescriptions avec cette valeur? Si oui, de quel côté êtes-vous incertain? –

Répondre

0

Cela ne ressemble pas à trier; Cela ressemble à un problème de filtrage. Si tel est le cas, vous devez décider si vos clés de filtrage sont destinées à être des éléments pouvant faire l'objet d'un signet, ou si elles sont dynamiques et si vous devez partir d'une base quelconque. Il décide si vous utiliserez ou non les URL en tant que clés de tri ou arguments CGI.

Dans les deux cas, le gestionnaire est similaire. Pour la première, vous créez dans votre urls.py:

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

Et vos projets pourrait ressembler à:

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

Vous n'avez pas besoin « utilisateur » du tout; Cela vous est fourni automatiquement par RequestContext, et est assuré par le fait que vous avez spécifié cette méthode login_required. Maintenant, vous pouvez voir "http://example.com/projects/quoted"

Pour les arguments CGI, votre ligne urls.py ressemble à ceci:

url('/projects/', quote_projects), 

Et votre fonction ressemble à ceci:

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

Et maintenant votre URL serait: http://example.com/project/?status=quoted

+0

wow merci Elf, ça m'a beaucoup aidé! – TheLifeOfSteve

+0

Hey Elf, je reçois un 'NoReverseMatch Caught en cours de rendu: Reverse pour' état-de-vue 'avec les arguments'() 'et les arguments de mot-clé' {} 'non trouvé.' lorsque vous essayez de charger le modèle. Aucune suggestion? – TheLifeOfSteve

+0

Cela ressemble à un problème différent. (J'ai également noté que j'ai donné le mauvais nom dans urls.py à la fonction, il est toujours nommé "quote_projects", pas "projets", comme je l'avais dans l'original). Ce que votre message d'erreur dit, c'est que votre fonction, "état d'affichage", a besoin d'un statut quelconque pour fonctionner correctement. –

Questions connexes