过滤项目状态

时间:2010-11-22 16:54:31

标签: django django-models filtering django-views

我正在尝试创建一个'按状态排序'功能,例如显示所有状态='quote'的项目。我在弄清楚如何解决这个问题时遇到了一些麻烦。

这是我的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))

非常感谢任何帮助!

谢谢,

史蒂夫

1 个答案:

答案 0 :(得分:0)

这看起来不像排序;这看起来像是一个过滤问题。

如果是这样,你必须决定你的过滤键是否是可收藏的项目,或者它们是否是动态的,而你的意思是从一些基础开始。决定您是否将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))

现在您的网址为:http://example.com/project/?status=quoted