1

我一直在为调度系统开发 Django 应用程序(使用 AJAX dhtmlScheduler 库),我需要对事件类型进行颜色编码。作为每个事件的一部分,客户希望我返回一个#00F162指示事件颜色的字符串。然后由客户端解析并由 Javascript 显示。

样式指南如下所述:http://docs.dhtmlx.com/doku.php?id=dhtmlxscheduler: custom_styling

第一个选项是在数据库中存储一个十六进制值,也许在event_type数据库中。第二个选项是将其逻辑放在我的应用程序中,并根据所选的班次进行计算。

将条目存储在event_type数据库中似乎很奇怪,因为我觉得我将外观与模型混合在一起并且颜色不会改变。第二个选项意味着我在应用程序中对值进行硬编码。

哪个是最好的方法?

4

2 回答 2

2

在这种特殊情况下,我会将十六进制颜色代码存储在模型中的字段中。

在本质上:

class Event(models.Model):
    ALERT   = "alert"
    WARNING = "warning"
    ERROR   = "error"
    EVENT_TYPES = (
        (ALERT,   "Alert"),
        (WARNING, "Warning"),
        (ERROR,   "Error"),
    )

    YELLOW = "FF6A00"
    ORANGE = "FFE800"
    RED    = "FF0000"
    COLOURS = (
        (YELLOW, "Yellow"),
        (ORANGE, "Orange"),
        (RED,    "Red"),
    )

    event_type = models.CharField(max_length=16, choices=EVENT_TYPES, default=ALERT)
    event_colour = models.CharField(max_length=6, choices=COLOURS, default=YELLOW)

附加说明,“常量”的原因是为了使使用此模型的代码简洁明了。

# example 1
error_events = Event.objects.filter(event_type=Event.ERROR)

# example 2
if my_event.event_type == Event.Error:
    # this is an error event
    pass

此外,这是一种在模型上没有颜色字段的情况下可以做到的方法:

class Event(models.Model):
    ALERT   = "alert"
    WARNING = "warning"
    ERROR   = "error"
    EVENT_TYPES = (
        (ALERT,   "Alert"),
        (WARNING, "Warning"),
        (ERROR,   "Error"),
    )

    # map events to colours
    COLOUR = {
        ALERT:   "FF6A00",
        WARNING: "FFE800",
        ERROR:   "FF0000",
    }

    event_type = models.CharField(max_length=16, choices=EVENT_TYPES, default=ALERT)

    @property
    def colour(self):
        """
        Return the hexadecimal colour of this event
        """
        self.COLOUR[event_type]

# now this would return True
my_error_event.colour == "FF0000"
于 2013-02-21T18:54:59.957 回答
0

有几种方法可以做到这一点。

如果 event_type 的颜色需要可编辑,我会将其作为 varchar 存储在数据库中。

如果颜色由您决定,那么我可能会处理__unicode__event_type 并使用 CSS 来定位该类。如果需要添加新的 event_type,这确实会为您提供少量维护,但它可以让您分离关注点。

于 2013-02-21T18:53:36.633 回答