How to properly use the “choices” field option in Django

前端 未结 7 2126
孤独总比滥情好
孤独总比滥情好 2020-12-12 23:17

I\'m reading the tutorial here: https://docs.djangoproject.com/en/1.5/ref/models/fields/#choices and i\'m trying to create a box where the user can select the month he was b

7条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-13 00:01

    $ pip install django-better-choices

    For those who are interested, I have created django-better-choices library, that provides a nice interface to work with Django choices for Python 3.7+. It supports custom parameters, lots of useful features and is very IDE friendly.

    You can define your choices as a class:

    from django_better_choices import Choices
    
    
    class PAGE_STATUS(Choices):
        CREATED = 'Created'
        PENDING = Choices.Value('Pending', help_text='This set status to pending')
        ON_HOLD = Choices.Value('On Hold', value='custom_on_hold')
    
        VALID = Choices.Subset('CREATED', 'ON_HOLD')
    
        class INTERNAL_STATUS(Choices):
            REVIEW = 'On Review'
    
        @classmethod
        def get_help_text(cls):
            return tuple(
                value.help_text
                for value in cls.values()
                if hasattr(value, 'help_text')
            )
    

    Then do the following operations and much much more:

    print( PAGE_STATUS.CREATED )                # 'created'
    print( PAGE_STATUS.ON_HOLD )                # 'custom_on_hold'
    print( PAGE_STATUS.PENDING.display )        # 'Pending'
    print( PAGE_STATUS.PENDING.help_text )      # 'This set status to pending'
    
    'custom_on_hold' in PAGE_STATUS.VALID       # True
    PAGE_STATUS.CREATED in PAGE_STATUS.VALID    # True
    
    PAGE_STATUS.extract('CREATED', 'ON_HOLD')   # ~= PAGE_STATUS.VALID
    
    for value, display in PAGE_STATUS:
        print( value, display )
    
    PAGE_STATUS.get_help_text()
    PAGE_STATUS.VALID.get_help_text()
    

    And of course, it is fully supported by Django and Django Migrations:

    class Page(models.Model):
        status = models.CharField(choices=PAGE_STATUS, default=PAGE_STATUS.CREATED)
    

    Full documentation here: https://pypi.org/project/django-better-choices/

提交回复
热议问题