2013-02-21 5 views
1

J'ai travaillé sur une application Django pour un système de planification (en utilisant la bibliothèque AJAX dhtmlScheduler) et j'ai besoin de coder en couleur les types d'événements. Dans le cadre de chaque événement, le client s'attend à ce que je renvoie une chaîne #00F162 indiquant la couleur de l'événement. Ceci est ensuite analysé par le client et affiché par le Javascript.Où stocker des informations de couleur dans une application Web?

Le guide de mise en forme est décrite ci-dessous: http://docs.dhtmlx.com/doku.php?id=dhtmlxscheduler:custom_styling

La première option consiste à stocker une valeur hexadécimale dans la DB, peut-être dans la base de données event_type. La deuxième option consiste à placer la logique pour cela dans mon application et à la calculer en fonction du décalage sélectionné.

Le stockage de l'entrée dans la base de données event_type semble étrange, car j'ai l'impression de mélanger l'apparence avec le modèle et les couleurs ne changeront pas. La deuxième option signifie que je suis coder en dur les valeurs dans l'application.

Quelle serait la meilleure approche?

+0

Combien de types d'événement prévoyez-vous avoir? – Matt

+0

Il y a environ 12. –

Répondre

2

Dans ce cas particulier, je stockerais le code de couleur hexadécimal dans un champ d'un modèle.

En substance:

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) 

Note complémentaire, la raison pour laquelle les « constantes » est de faire du code qui utilise ce modèle propre et simple.

# 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 

De plus, voici une façon que vous pouvez le faire sans un champ de couleur sur le modèle:

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" 
+0

Great. La deuxième approche est exactement ce dont j'ai besoin. Je peux garder tout près de la source affectant la DB. –

0

Il y a plusieurs façons de le faire.

Si la couleur d'un event_type doit être modifiable, je le stockerais dans la base de données en tant que varchar.

Si la couleur vous appartient, alors je devrais probablement slugifier le __unicode__ de event_type et utiliser CSS pour cibler cette classe. Cela vous présente une petite quantité de maintenance, si un nouveau event_type doit être ajouté, mais cela vous permet de séparer les problèmes.

Questions connexes