2011-10-02 41 views
0

我有两个型号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") 

我想列出与当前登录用户的审批状态的所有文件,当用户同意/弃权/不批准文件我在审批表记录否则在“审批表”中没有关于当前用户审批状态的记录

请帮我看看和模板。

回答

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 ”。

+0

Approval审批表中每个文件都没有审批记录审批表只有在用户提交审批状态时才会更新......否则审批状态为'您的审批' – user975472

+0

好的,我已经改写答案。 – danihp

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>