模型逻辑中的django模板

时间:2012-02-05 17:22:42

标签: django-models django-templates

我希望生成与有限(> 20,<100)类型相关联的自动消息:

class Message(models.Model):
    MSG_CHOICES = (
        ('MEETING', 'Meeting Reminder'),
        ('STATUS', 'Status Change Reminder'),
        ...
        )
    message = models.CharField(max_length=100)
    msg_type = models.CharField(max_length=10, choices=MSG_CHOICES)

每个的实际消息取决于我必须在某个时刻提供它的类型和参数。例如,会议&#39;会议&#39;消息基本上是:

"Hi, you have a meeting at %s with %s." % (time, person_to_meet)

同时“状态”&#39;消息将类似于

"Hi, this is a reminder that you changed your %s status to %s." % (status_type, new_status)

现在,这里的复杂性是我们必须针对不同的类型呈现不同的消息。这是我尝试集思广益的一些方法:

  1. 修改模型,使其具有基本消息模型和每个模型的派生模型,并使用自己的构造函数类型,保存&#34;字符串模板&#34;在每个模型的构造函数内部。这符合使用不同逻辑分离模型的模式(我通常会为不同类型的模型执行此操作&#34;),但感觉很笨,因为除了创建消息的逻辑之外,这些人都是基本相同。逻辑的唯一区别来自于自己创建消息,而仅仅因为它而分裂似乎是浪费。
  2. 保持模型不变,在代码中创建类方法,为每种类型创建工厂,保存&#34;字符串模板&#34;在类内(甚至在数据库内)。这是最简单的,但感觉很脏。
  3. 这是创意/疯狂的(因此标题):保持模型不变,并将字符串模板保存为实际模板文件。在构造函数中,使用Django模板库来呈现这些文件并返回字符串。这看起来很好,因为它将硬编码数据与代码逻辑分离出来,但由于我在两个不同级别的代码中使用模板(一个用于制作模型,一个用于视图),因此感觉很不稳定。它&#34;感觉&#34;错了,但我无法确定原因。
  4. 所以主要问题是:

    1. 这种情况的最佳做法是什么?这是其中之一还是其​​他方法?
    2. 是否有&#34;型号&#34;某个地方的这种做法的例子?我觉得很多系统会生成自动警报/消息,所以如果有一个特别好的代码,我想看看它。
    3. 谢谢!

      -Yan

1 个答案:

答案 0 :(得分:0)

恕我直言,你根本不应该将信息存储在数据库中。您正在存储msg_type。这应该足够了。您向用户显示信息的逻辑(通过模板)应该处理这个问题。这将允许您根据Accept-Language标头在将来的某个时间点本地化消息。根据我的经验,在db中存储用户消息是个坏主意。而且,至少就我的思维方式而言,它并不是真正的商业逻辑。它似乎属于UI层。好。只是我对它的看法。这个问题很老了。我很想知道你最终在这里做了什么。