# django-stdfields

 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels 79bd881 2011-10-30 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels 2db724f 2011-12-02 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels 79bd881 2011-10-30 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels 79bd881 2011-10-30 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels c4916cd 2011-10-30 Kevin Wetzels f1e6c3e 2011-10-30 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels 3d6549c 2011-10-30 Kevin Wetzels 5f258a6 2011-10-30 Kevin Wetzels c4916cd 2011-10-30 Kevin Wetzels 79bd881 2011-10-30 Kevin Wetzels 50ce8df 2011-11-10 Kevin Wetzels 79bd881 2011-10-30 Kevin Wetzels 50ce8df 2011-11-10 Kevin Wetzels 79bd881 2011-10-30   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 ================ django-stdfields ================ Fields I wish were standard in Django. At the moment this is limited to the MinutesField, EnumIntegerField and EnumCharField. Install:: pip install django-stdfields Contents ======== * stdfields.forms.MinutesField: use an integer to represent a duration of minutes and hours * stdfields.fields.EnumIntegerField: makes working with choices a bit easier * stdfields.fields.EnumCharField: the same, but for choices with a char key MinutesField ------------ Is an extension of Django's standard django.forms.IntegerField. This field will accept values for a duration in minutes in the formats hh:mm or h.fraction, similar to the way BaseCamp allows you to specify your time spent on a task as either 8:30 or 8.5. In the latter case only 8.25, 8.5, 8.50 and 8.75 are considered valid inputs. Example ^^^^^^^ Actions speak louder than words:: # models.py class Task(models.Model): time_spent = models.IntegerField() # forms.py from stdfields.forms import MinutesField from models import Task class TaskForm(forms.ModelForm): time_spent = MinutesField(label='How long did it take?') class Meta: model = Task You can use the minutes template filter from stdfieldstags to render such a field in the format 8:30:: {% load stdfieldstags %} It took me {{ task.time_spent|minutes }} to complete this task. Enumeration ----------- I always end up with ugly code when using Django's choices argument for fields. With the stdfields.models.Enumeration class, I've got a handy base class that allows me to keep things tidy:: # models.py class Color(Enumeration): RED = 'R' GREEN = 'G' BLUE = 'B' @classmethod def all(cls): return [ (cls.RED, _(u'Red')), (cls.GREEN, _(u'Green')), (cls.BLUE, _(u'Blue')) ] class Pencil(models.Model): color = models.CharField(choices=Color.all(), max_length=Color.max_length()) # views.py def red_pencils(request): pencils = Pencil.objects.filter(color=Color.RED) ... # Prints 'Showing the Red pencils' logging.info('Showing the %s pencils' % (Color.as_display(Color.RED))) That could be shorter. Use Enum instead:: # models.py class Color(Enum): RED = EnumValue('R', 'Red') GREEN = EnumValue('G', 'Green') BLUE = EnumValue('B', 'Blue') class Pencil(models.Model): color = models.CharField(choices=Color.all(), max_length=Color.max_length()) # views.py def red_pencils(request): pencils = Pencil.objects.filter(color=Color.RED) ... # Prints 'Showing the Red pencils' logging.info('Showing the %s pencils' % (Color.RED_display)) EnumCharField and EnumIntegerField ---------------------------------- And now we can make working with an Enum easier with the EnumCharField and EnumIntegerField models fields:: # models.py class Color(Enumeration): # same as above class Pencil(models.Model): color = models.EnumCharField(enum=Color, max_length=Color.max_length()) This example is basically the same as the above since EnumCharField is a subclass of the regular Django CharField. By using the enum keyword argument of the enum field, the choices will be automatically updated when you update the enumeration object. And since you're using the provided max_length method of Enumeration, the max_length will be updated when needed. Just like in the previous example. The enum fields simply offer some more clarity when reading the code. EnumIntegerField works exactly the same, but for enumerations with integer keys. Both fields can be used with South.