使用中间模型从url参数过滤视图?

时间:2014-11-24 22:35:18

标签: python django django-class-based-views

我一直试图弄清楚如何使用当前页面的id来过滤(获取)页面的上下文。

我有一个url http:/.../ backend / projects / 1 / functions / 1对应于project.id = 1和function.id = 1的项目详细信息页面

但是,在我的下面的FunctionDetail视图中。它返回所有Function模型对象 - 并且不会根据当前项目进行过滤。

如何从URL中获取要在视图中过滤的ID?另外,我想在模板中访问我的RoletoFunction对象的内容。

我是否能够像这样在FunctionDetail中迭代:

 for f in function.roletofunction_set.all: 
    f.allocation

一直试图在Google / Stackexchange上解决这个问题,但是无法破解它。

非常感谢帮助!

干杯,

models.py

class Project(models.Model):
    proj_name = models.CharField()
    assigned_to = models.ManyToManyField(User, related_name='assigned_to')

class Capability(models.Model):
    name = models.CharField()
    project = models.ManyToManyField(Project)

class Function(models.Model):
    name = models.CharField()
    capability = models.ForeignKey(Capability)
    performs_role = models.ManyToManyField('Role', through='RoletoFunction')

class Role(models.Model):
    name = models.CharField()
    performs_func = models.ManyToManyField(Function, through='RoletoFunction')
    project = models.ManyToManyField(Project)

class RoletoFunction(models.Model):
    role = models.ForeignKey(Role)
    function = models.ForeignKey(Function)
    name = models.CharField()
    allocation = models.DecimalField(max_digits=5, decimal_places=2)

urls.py

# backend/projects/1/functions/1/
url(r'^projects/(?P<pk>\d+)/functions/(?P<function_id>\d+)/$', views.FunctionDetail.as_view(), name='function_detail'),

# /backend/projects/[id]/
url(r'^projects/(?P<pk>\d+)/$', views.ProjectDetail.as_view(), name='project_detail'),  

views.py

class ProjectList(ListView):
    model = Project
    context_object_name = 'proj_list'

    def get_queryset(self):
        user = self.request.user
        return Project.objects.filter(assigned_to=user)

class FunctionDetail(DetailView):
    model = Function
    template_name = 'backend/function_detail.html'
    context_object_name = 'function'

    def get_queryset(self):
        """return list of functions"""
        self.function = get_object_or_404(Function, name=self.args[2])
        return Function.objects.filter(id=self.args[2])

1 个答案:

答案 0 :(得分:1)

您可以覆盖DetailView&#39; get_context_data,将RoletoFunction模型的数据添加到上下文中。例如:

class FunctionDetail(DetailView):
     ...
     def get_context_data(self, **kwargs):
        context = super(FunctionDetail, self).get_context_data(**kwargs)

        if 'function_id' in kwargs:  #this is how you can get function_id's data from url
            _id = int(kwargs['function_id'] or '0')
        else:
            _id = 0
        function =  Function.objects.get(id=_id)
        context['role_function'] = RoletoFunction.objects.filter(function=function)
        return context