具有动态添加属性的Django模型对象

时间:2015-01-27 16:39:25

标签: python django model django-templates

我正在寻找一种方法来动态地为django模型实例添加额外的属性,以便可以在模板中访问它们

例如,

在models.py

class Foo(models.Model):
    name = models.TextField()
在views.py中

def my_view(request):
    f = Foo.objects.get(id=1234)

    # method in question
    f.____add_extra_attribute____('extra_attribute', attr_value)

    return render(request, 'my_template.html', {'foo_instance':f})
my_template.html

中的

<h1>{{ foo_instance.name }}</h1>
<p>{{ foo_instance.extra_attribute }}</p>

有没有办法实现这一点而不将实例渲染为字典而不是Foo模型对象?

2 个答案:

答案 0 :(得分:2)

根据@ mgilson的评论,您可以将extra_attribute传递给单独的上下文变量中的模板

def my_view(request):
    f = Foo.objects.get(id=1234)
    extra_attribute = attr_value
    return render(request, 'my_template.html', 
                  {'foo_instance': f, 'extra_attribute': attr_value})

如果您仍想在模型实例上设置属性,可以直接设置它:

f.extra_attribute = attr_value

答案 1 :(得分:0)

看下面的例子。这是我项目中的真实代码。在这里,我已将属性附加到模型对象本身。

我的模特:

class Task(models.Model):
    name = models.CharField(max_length=500)
    description = models.TextField(max_length=500, blank=True)
    assignee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True)
    report = models.ForeignKey(UtilizationReport, on_delete=models.CASCADE, null=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, blank=True)
    billable_efforts = models.FloatField(
        validators=[MinValueValidator(0.0), MaxValueValidator(1.0)],
        )
    created_at = models.DateTimeField(default=timezone.now, editable=False)
    reviewed = models.BooleanField(default=False)

在view.py中:

task = Task.objects.get(id=1) # Just an example...won't be really using get with id
task_rate = BillingCatagoryRate.objects.get(rate_card=invoice.rate_card, billing_category=task.assignee.billing_category).billing_rate
task.task_price = task_rate * task.billable_efforts # Note: task_price is NOT a model field.

在模板中:

<td class="text-center">{{ task.task_price }}</td>