1

我正在寻找一种方法来扩展 django 模板/视图。

我的第一个实现包括两个模型(clients/models.py):

class Client(models.Model):
    ...

class Address(models.Model):
    client = models.ForeignKey(Client)
    ...

及其相当简单的模板 ( clients/detail.html) :

{{client.name}}
Address: {{client.address.street}}, {{client.address.zipcode}} {{client.address.city}}

随着我的应用程序的增长,一个新的应用程序诞生了:“发票”。

同样非常简单(invoices/models.py):

class Invoice(models.Model):
    client = models.ForeignKey(clients.models.Client)
    ...

现在我的客户详细信息视图需要显示发票,所以我clients/detail.html在我的“发票”应用程序中创建和覆盖。

现在很好。

后来我创建了第三个应用程序“报价”。我的客户详细信息视图再次需要显示报价。

如果我clients/detail.html在我的“客户”中创建,我将失去显示发票的能力。

因为“发票”和“报价”应用程序是独立的。

我的第一个想法是创建类似 SubView 类的东西,它可以扩展“发票”和“报价”,然后在某处注册它们的实现。

模板应如下所示:

{{client.name}}
Address: {{client.address.street}}, {{client.address.zipcode}} {{client.address.city}}

{% for view in views %}
    <h1>{{view.title}}</h1>
    {{view.get_html}}
{% endfor %}

这是一个好方法吗?我应该使用类似admin.site的实现来注册我的子视图吗?

4

1 回答 1

4

在 Djangourl中,urls.py理想情况下应该使用one view,以保持简单。

因此,我将采用将所有必需的上下文放在此屏幕的一个视图中的方法(我认为您已经通过模型中的外键获得了这个)。然后,我不会做你所谓的“SubView-class”,而是选择 Django 模板include tag

例子:

{% for invoice in client.invoices %}
    {% include "invoice-detail.html" with invoice=invoice %}
{% endfor %}

这将为client. 请注意这如何符合DRY 原则

于 2012-04-14T12:08:59.563 回答