1

我有一个问题,我不知道解决它的正确方法。

基本上,我有一个模式,称为任务:

class Task(models.Model):
    #mto1: many task made of one template
    template = models.ForeignKey(Template)
    STATUS_CHOISE = (('PR', 'In process'), ('ST', 'Stopped'), ('FN', 'Finished'), ('DL', 'Deleted'),)
    status = models.CharField(max_length=2, choices=STATUS_CHOISE, default='ST')
    responses_required = models.IntegerField(default=0)
    date_deadline = models.DateTimeField(auto_now=False, auto_now_add=False)
    date_created = models.DateTimeField(auto_now_add=True, auto_now=False)

可以有几个答案

class Response(models.Model):
    #mto1: many Responses generated for one task
    task = models.ForeignKey(Template)
    STATUS_CHOISE = (('PR', 'Process'), ('FN', 'Finished'))
    status = models.CharField(max_length=2, choices=STATUS_CHOISE, default='ST')
    date_finished= models.DateTimeField(auto_now_add=False, auto_now=True)
    date_created = models.DateTimeField(auto_now_add=True, auto_now=False)
    ip_address=models.IPAddressField()

现在,我想显示一个用户的所有任务(来自模板模型,并且已经完成)以及有关答案的其他信息,这些信息是 - 给出的答案数量(所以哪个状态是 = FN) - 数量总答案(状态 FN 或 PR)-也许还有一些额外的信息。

我做了这个

@login_required
def TemplateList(request):
    task_list = Task.objects.filter(user=request.user)
    return render_to_response('task_list.html',{'task_list':task_list}, context_instance=RequestContext(request))

但这只是显示模型中存在的数据,我要计算的值呢?

到目前为止,我使用 CustomTag 完成了它,但它似乎不是一个干净的解决方案。我宁愿在视图中执行逻辑,然后仅使用模板来显示结果。但是:如何将此值添加到任务列表的每个项目中?

我是否必须这样做: 将附加数据传递给 Django 中的模板,以便从头开始创建对象(这也需要我在模板中使用一些逻辑,因为我必须将列表中的值与我创建的对象匹配)? 还是有更好的解决方案?

我以这种方式尝试了通用视图,例如 list_detail.object_list

def TaskListDetail(request):
return list_detail.object_list(
    request,
    queryset = Task.objects.filter(user=request.user),
    template_name = 'task_list.html',
    template_object_name = 'task_list',

)

但首先,它不显示任何内容(而另一个视图显示数据),其次我不知道如何以与列表项匹配的方式添加额外数据。

有什么建议吗?

4

1 回答 1

1

您可以向模型添加方法。

class Task(models.Model):
   #mto1: many task made of one template
   template = models.ForeignKey(Template)
   STATUS_CHOISE = (('PR', 'In process'), ('ST', 'Stopped'), ('FN', 'Finished'), ('DL', 'Deleted'),)
   status = models.CharField(max_length=2, choices=STATUS_CHOISE, default='ST')
   responses_required = models.IntegerField(default=0)
   date_deadline = models.DateTimeField(auto_now=False, auto_now_add=False)
   date_created = models.DateTimeField(auto_now_add=True, auto_now=False)

   def do_some_calculation(self):
       #make funny things
       return "foo"

在您的模板中,您可以通过以下方式访问它:

{% for taks in task_list %}
   {{ task.do_some_calculation }}
{% endfor %}
于 2012-10-30T01:03:57.787 回答