Фильтрация статуса проекта - PullRequest
0 голосов
/ 22 ноября 2010

Я пытаюсь создать функцию «сортировка по статусу», которая показывает, например, все проекты со статусом = «цитата». У меня возникли некоторые затруднения, когда я понимаю, как мне поступить.

Вот мой models.py (упрощенно)

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) 

У меня нет проблем с созданием отдельных представлений в views.py, но должен быть более эффективный способ, чем создание нескольких представлений.

Вот мой взгляд, чтобы показать только статус проектов цитаты:

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

Любая помощь будет принята с благодарностью!

Спасибо

Steve

1 Ответ

0 голосов
/ 22 ноября 2010

Это не похоже на сортировку; это похоже на проблему фильтрации.

Если это так, вам нужно решить, предназначены ли ваши фильтрующие ключи для закладок, или они динамические, и вы должны начать с какой-то базы. Решает, будете ли вы использовать URL-адреса в качестве ключей сортировки или аргументы CGI.

В любом случае, обработчик похож. Во-первых, вы должны создать в своем urls.py:

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

И ваши проекты могут выглядеть так:

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

Вам не нужен «пользователь» вообще; он автоматически предоставляется RequestContext и подтверждается тем фактом, что вы указали этот метод login_required. Теперь вы можете сослаться на "http://example.com/projects/quoted"

Для аргументов CGI ваша строка urls.py выглядит следующим образом:

url('/projects/', quote_projects),

И ваша функция выглядит так:

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

А теперь ваш URL будет: http://example.com/project/?status=quoted

...