【问题标题】:Django display additional info for items in a listDjango 显示列表中项目的附加信息
【发布时间】:2012-10-29 15:06:33
【问题描述】:

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

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

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 完成的,但这似乎不是一个干净的解决方案。我宁愿在视图中执行逻辑,然后仅使用模板来显示结果。 但是:如何将此值添加到任务列表的每个项目中?

我是否必须这样做:Passing additional data to a template in 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',

)

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

有什么建议吗?

【问题讨论】:

  • 看起来不错,但这不允许我传递参数。所以如果我想计算像 status = 'PR' 和另一个像 status = 'ST' 这样的 smt,我必须创建 2 个属性函数。
  • 另一件事。我什么时候必须添加@property 注释,为什么不添加?

标签: django templates


【解决方案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 %}

【讨论】:

  • 好的,这就是 Ngure 的回答。一个问题,我什么时候应该使用@property,什么时候不应该?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多