Flask-WTF default for a SelectField doesn't work for SQLAlchemy enum types












0














I have a Flask-SQLAlchemy site which uses the SQLAlchemy enum type for certain columns, to restrict possible input values.



For example, I have a "payment type" enum that has a few payment type options, like so:



class PaymentType(enum.Enum):
fixed = "fixed"
variable = "fixed_delivery"
quantity_discount = "quantity_discount"


When I use this in a dropdown/select I can specify the options like so:



prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))


The All() function I'm calling returns the different enum values as options, and also adds a custom "Please select..." option to the dropdown list. It looks like this:



class PaymentTypes(object):

@staticmethod
def All(blank_value=None, blank_text=None):
ret = [(i.value, _(i.name)) for i in PaymentType]
SelectOption.add_blank_item(ret, blank_value, blank_text)
return ret


So far, so good, I get a nice dropdown, with the correct options. the problem arises when I want to display the form using an already existing SQLAlchemy object from the database.



When I fetch the object from SQLAlchemy, the prd_payment_type property contains the enum PaymentType.quantity_discount, not just a string value 'quantity_discount':
enter image description here



Because WTForms (presumably) matches the pre-selected option in the dropdown to a string value "quantity_discount", it doesn't match the enum in the SQLAlchemy model and the option is not selected in the dropdown.



The SelectField of WTForms accepts a list of tuples containing strings as choices. I can't feed it my enum.
On the other hand, the SQLAlchemy model returns an enum type as the property for prd_payment_type. I could maybe override this property or something, but that feels like a lot of work to support SQLAlchemy's enums in WTForms.



Is there a standard solution for working with SQLAlchemy's enums in a WTForms SelectField or should I abandon using enums altogether and just store strings, maybe from a list of constants to keep them in check?










share|improve this question



























    0














    I have a Flask-SQLAlchemy site which uses the SQLAlchemy enum type for certain columns, to restrict possible input values.



    For example, I have a "payment type" enum that has a few payment type options, like so:



    class PaymentType(enum.Enum):
    fixed = "fixed"
    variable = "fixed_delivery"
    quantity_discount = "quantity_discount"


    When I use this in a dropdown/select I can specify the options like so:



    prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))


    The All() function I'm calling returns the different enum values as options, and also adds a custom "Please select..." option to the dropdown list. It looks like this:



    class PaymentTypes(object):

    @staticmethod
    def All(blank_value=None, blank_text=None):
    ret = [(i.value, _(i.name)) for i in PaymentType]
    SelectOption.add_blank_item(ret, blank_value, blank_text)
    return ret


    So far, so good, I get a nice dropdown, with the correct options. the problem arises when I want to display the form using an already existing SQLAlchemy object from the database.



    When I fetch the object from SQLAlchemy, the prd_payment_type property contains the enum PaymentType.quantity_discount, not just a string value 'quantity_discount':
    enter image description here



    Because WTForms (presumably) matches the pre-selected option in the dropdown to a string value "quantity_discount", it doesn't match the enum in the SQLAlchemy model and the option is not selected in the dropdown.



    The SelectField of WTForms accepts a list of tuples containing strings as choices. I can't feed it my enum.
    On the other hand, the SQLAlchemy model returns an enum type as the property for prd_payment_type. I could maybe override this property or something, but that feels like a lot of work to support SQLAlchemy's enums in WTForms.



    Is there a standard solution for working with SQLAlchemy's enums in a WTForms SelectField or should I abandon using enums altogether and just store strings, maybe from a list of constants to keep them in check?










    share|improve this question

























      0












      0








      0







      I have a Flask-SQLAlchemy site which uses the SQLAlchemy enum type for certain columns, to restrict possible input values.



      For example, I have a "payment type" enum that has a few payment type options, like so:



      class PaymentType(enum.Enum):
      fixed = "fixed"
      variable = "fixed_delivery"
      quantity_discount = "quantity_discount"


      When I use this in a dropdown/select I can specify the options like so:



      prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))


      The All() function I'm calling returns the different enum values as options, and also adds a custom "Please select..." option to the dropdown list. It looks like this:



      class PaymentTypes(object):

      @staticmethod
      def All(blank_value=None, blank_text=None):
      ret = [(i.value, _(i.name)) for i in PaymentType]
      SelectOption.add_blank_item(ret, blank_value, blank_text)
      return ret


      So far, so good, I get a nice dropdown, with the correct options. the problem arises when I want to display the form using an already existing SQLAlchemy object from the database.



      When I fetch the object from SQLAlchemy, the prd_payment_type property contains the enum PaymentType.quantity_discount, not just a string value 'quantity_discount':
      enter image description here



      Because WTForms (presumably) matches the pre-selected option in the dropdown to a string value "quantity_discount", it doesn't match the enum in the SQLAlchemy model and the option is not selected in the dropdown.



      The SelectField of WTForms accepts a list of tuples containing strings as choices. I can't feed it my enum.
      On the other hand, the SQLAlchemy model returns an enum type as the property for prd_payment_type. I could maybe override this property or something, but that feels like a lot of work to support SQLAlchemy's enums in WTForms.



      Is there a standard solution for working with SQLAlchemy's enums in a WTForms SelectField or should I abandon using enums altogether and just store strings, maybe from a list of constants to keep them in check?










      share|improve this question













      I have a Flask-SQLAlchemy site which uses the SQLAlchemy enum type for certain columns, to restrict possible input values.



      For example, I have a "payment type" enum that has a few payment type options, like so:



      class PaymentType(enum.Enum):
      fixed = "fixed"
      variable = "fixed_delivery"
      quantity_discount = "quantity_discount"


      When I use this in a dropdown/select I can specify the options like so:



      prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))


      The All() function I'm calling returns the different enum values as options, and also adds a custom "Please select..." option to the dropdown list. It looks like this:



      class PaymentTypes(object):

      @staticmethod
      def All(blank_value=None, blank_text=None):
      ret = [(i.value, _(i.name)) for i in PaymentType]
      SelectOption.add_blank_item(ret, blank_value, blank_text)
      return ret


      So far, so good, I get a nice dropdown, with the correct options. the problem arises when I want to display the form using an already existing SQLAlchemy object from the database.



      When I fetch the object from SQLAlchemy, the prd_payment_type property contains the enum PaymentType.quantity_discount, not just a string value 'quantity_discount':
      enter image description here



      Because WTForms (presumably) matches the pre-selected option in the dropdown to a string value "quantity_discount", it doesn't match the enum in the SQLAlchemy model and the option is not selected in the dropdown.



      The SelectField of WTForms accepts a list of tuples containing strings as choices. I can't feed it my enum.
      On the other hand, the SQLAlchemy model returns an enum type as the property for prd_payment_type. I could maybe override this property or something, but that feels like a lot of work to support SQLAlchemy's enums in WTForms.



      Is there a standard solution for working with SQLAlchemy's enums in a WTForms SelectField or should I abandon using enums altogether and just store strings, maybe from a list of constants to keep them in check?







      flask sqlalchemy flask-sqlalchemy flask-wtforms wtforms






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 '18 at 21:32









      Erik Oosterwaal

      2,76312049




      2,76312049
























          1 Answer
          1






          active

          oldest

          votes


















          0














          I have found a solution myself. It seems that when the enum has a



          def __str__(self):
          return str(self.value)


          That's enough for WTForms to match the database value to the SelectField value.
          I have made a baseclass that derives from enum.Enum and added the code above to return the enum value as a string representation.



          This solution was based on these similar problems I found later on:



          https://github.com/flask-admin/flask-admin/issues/1315



          Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation






          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438191%2fflask-wtf-default-for-a-selectfield-doesnt-work-for-sqlalchemy-enum-types%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            I have found a solution myself. It seems that when the enum has a



            def __str__(self):
            return str(self.value)


            That's enough for WTForms to match the database value to the SelectField value.
            I have made a baseclass that derives from enum.Enum and added the code above to return the enum value as a string representation.



            This solution was based on these similar problems I found later on:



            https://github.com/flask-admin/flask-admin/issues/1315



            Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation






            share|improve this answer


























              0














              I have found a solution myself. It seems that when the enum has a



              def __str__(self):
              return str(self.value)


              That's enough for WTForms to match the database value to the SelectField value.
              I have made a baseclass that derives from enum.Enum and added the code above to return the enum value as a string representation.



              This solution was based on these similar problems I found later on:



              https://github.com/flask-admin/flask-admin/issues/1315



              Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation






              share|improve this answer
























                0












                0








                0






                I have found a solution myself. It seems that when the enum has a



                def __str__(self):
                return str(self.value)


                That's enough for WTForms to match the database value to the SelectField value.
                I have made a baseclass that derives from enum.Enum and added the code above to return the enum value as a string representation.



                This solution was based on these similar problems I found later on:



                https://github.com/flask-admin/flask-admin/issues/1315



                Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation






                share|improve this answer












                I have found a solution myself. It seems that when the enum has a



                def __str__(self):
                return str(self.value)


                That's enough for WTForms to match the database value to the SelectField value.
                I have made a baseclass that derives from enum.Enum and added the code above to return the enum value as a string representation.



                This solution was based on these similar problems I found later on:



                https://github.com/flask-admin/flask-admin/issues/1315



                Python Flask WTForm SelectField with Enum values 'Not a valid choice' upon validation







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 22 '18 at 22:03









                Erik Oosterwaal

                2,76312049




                2,76312049






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438191%2fflask-wtf-default-for-a-selectfield-doesnt-work-for-sqlalchemy-enum-types%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Sphinx de Gizeh

                    Dijon

                    xlwings: Save and Close