django检查哪些用户批准了文件

时间:2011-10-02 14:56:03

标签: django

我有两个型号

class Document(models.Model):
    name = models.CharField(max_length=250, blank=True)

class Approval(models.Model):
    document = models.ForeignKey(Document)
    user = models.ForeignKey(User, related_name='approval user')
    status = models.IntegerField(choices=APPROVELS, default=1, help_text="Approved")

我希望列出具有当前登录用户批准状态的所有文档,当用户批准/弃权/未批准我在批准表中记录的文档时,否则在批准表中没有关于当前用户批准状态的记录

请帮我查看视图和模板。

2 个答案:

答案 0 :(得分:1)

在视图上:

userApprovals = Approval.objects.filter( user = request.user )
or
userApprovals = request.user.approval_user_set.all()
forYourApproval = Document.objects.exclude( pk__in = [ a.document.pk for a in userApprovals ] )

并且不要忘记在render_to_response上包含userApprovals:

return render_to_response(
                  "yourPage.html", 
                  {
                   "userApprovals": userApprovals,
                   "forYourApproval": forYourApproval,
                   },
                  context_instance=RequestContext(request))

在模板上:

{% for approval in userApprovals %}
   {{ approval.document.name }} status {{ approval.get_status_display }}
{% endfor %}

{% for document in forYourApproval %}
   {{ document.name }} waiting for your approval.
{% endfor %}

注意:将相关名称更改为“approval_user”。

答案 1 :(得分:0)

目前尚不清楚您的要求是否允许任何用户批​​准文档,但我推断这是基于您的模型的情况。如果Document只能由特定用户或一组用户批准,或者文档得到多个用户的批准,则需要对模型设计进行一些重大更改。

如果没有,我会写一个这样的观点:

from django.db.models import Q

def approval_view(request):
    documents = Document.objects.filter(
         Q(approval__id__isnull=True) | Q(approval__user=request.user))
    return render_to_response(template_name, {'documents': documents})

这将返回一个上下文,其中包含批准表中没有审批记录或已被request.user批准的文档。

您可能需要一些额外的代码才能在documents中显示每个文档的相应信息。例如,可能需要显示文档状态("For your Approval""Approved"或其他)的自定义模板过滤器。示例模板片段:

{% for document in documents %}
    <li>{{ document.name }} - {{ document|approval_status }}</li> 
{% endfor %}

正如我在开始时所说,你的要求并不清楚。是否每个用户都有机会批准文件?或者所有文件都有机会获得任何用户的批准?有一个很大的区别,这段代码反映了后一种假设。

如果每个用户都有机会批准文档,并且您需要显示当前用户的批准决定,那么上述代码将稍作修改。我可能会修改视图以按某种顺序显示所有文档:

documents = Document.objects.all()

然后使用上面的自定义模板过滤器显示当前用户的批准状态(将用户作为参数传递):

<li>{{ document.name }} - {{ document|approval_status:request.user }}</li>