我一直试图弄清楚如何使用当前页面的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])
答案 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