WTForms StringField Dynamic Default Value using datetime.utcnow / Callable?












1















I have a WTForm with the following:



class MyForm(FlaskForm):
...
timestamp = DateTimeField("Timestamp", default = datetime.utcnow, validators = [Required()])
name = StringField("Name", default = str(int(datetime.utcnow().timestamp())), validators = [Optional()])
...


Upon creating a new form the default timestamp field updates as expected while the default name field continues to use the timestamp of when the app was started. I can successfully set the timestamp in my route, my preference is to utilize the default functionality of the form. Looking here:



The Field base class



It states that default "May be a callable." but I haven't been able to find a working example of this. I'm assuming if I make this a callable, the default value will update with current timestamp. Does anyone know how to make default get its value from a function?



Thanks in advance,



Brian










share|improve this question





























    1















    I have a WTForm with the following:



    class MyForm(FlaskForm):
    ...
    timestamp = DateTimeField("Timestamp", default = datetime.utcnow, validators = [Required()])
    name = StringField("Name", default = str(int(datetime.utcnow().timestamp())), validators = [Optional()])
    ...


    Upon creating a new form the default timestamp field updates as expected while the default name field continues to use the timestamp of when the app was started. I can successfully set the timestamp in my route, my preference is to utilize the default functionality of the form. Looking here:



    The Field base class



    It states that default "May be a callable." but I haven't been able to find a working example of this. I'm assuming if I make this a callable, the default value will update with current timestamp. Does anyone know how to make default get its value from a function?



    Thanks in advance,



    Brian










    share|improve this question



























      1












      1








      1








      I have a WTForm with the following:



      class MyForm(FlaskForm):
      ...
      timestamp = DateTimeField("Timestamp", default = datetime.utcnow, validators = [Required()])
      name = StringField("Name", default = str(int(datetime.utcnow().timestamp())), validators = [Optional()])
      ...


      Upon creating a new form the default timestamp field updates as expected while the default name field continues to use the timestamp of when the app was started. I can successfully set the timestamp in my route, my preference is to utilize the default functionality of the form. Looking here:



      The Field base class



      It states that default "May be a callable." but I haven't been able to find a working example of this. I'm assuming if I make this a callable, the default value will update with current timestamp. Does anyone know how to make default get its value from a function?



      Thanks in advance,



      Brian










      share|improve this question
















      I have a WTForm with the following:



      class MyForm(FlaskForm):
      ...
      timestamp = DateTimeField("Timestamp", default = datetime.utcnow, validators = [Required()])
      name = StringField("Name", default = str(int(datetime.utcnow().timestamp())), validators = [Optional()])
      ...


      Upon creating a new form the default timestamp field updates as expected while the default name field continues to use the timestamp of when the app was started. I can successfully set the timestamp in my route, my preference is to utilize the default functionality of the form. Looking here:



      The Field base class



      It states that default "May be a callable." but I haven't been able to find a working example of this. I'm assuming if I make this a callable, the default value will update with current timestamp. Does anyone know how to make default get its value from a function?



      Thanks in advance,



      Brian







      python flask flask-wtforms wtforms






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 24 '18 at 15:46









      snakecharmerb

      10.6k42250




      10.6k42250










      asked Nov 23 '18 at 17:36









      FaivreFaivre

      154




      154
























          1 Answer
          1






          active

          oldest

          votes


















          0














          In your timestamp field, you provide a callable - datetime.datetime.utcnow to default, so each time the form is instantiated the callable is called and the new result is used.



          In your name field, datetime.datetime.utcnow().timestamp() is evaluated when the form is compiled, so the default value is the same for every instance of the form.



          If you want the default value of name to be evaluated every time the form is instantiated, pass it a function (a callable) that returns datetime.datetime.utcnow().timestamp().



          Like this:



          def get_default():
          datetime.datetime.utcnow().timestamp()


          class MyForm(FlaskForm):
          timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
          name = StringField("Name", default=get_default, validators=[Optional()])


          or if you prefer, you can use a lambda:



          class MyForm(FlaskForm):
          timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
          name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])





          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%2f53450930%2fwtforms-stringfield-dynamic-default-value-using-datetime-utcnow-callable%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














            In your timestamp field, you provide a callable - datetime.datetime.utcnow to default, so each time the form is instantiated the callable is called and the new result is used.



            In your name field, datetime.datetime.utcnow().timestamp() is evaluated when the form is compiled, so the default value is the same for every instance of the form.



            If you want the default value of name to be evaluated every time the form is instantiated, pass it a function (a callable) that returns datetime.datetime.utcnow().timestamp().



            Like this:



            def get_default():
            datetime.datetime.utcnow().timestamp()


            class MyForm(FlaskForm):
            timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
            name = StringField("Name", default=get_default, validators=[Optional()])


            or if you prefer, you can use a lambda:



            class MyForm(FlaskForm):
            timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
            name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])





            share|improve this answer




























              0














              In your timestamp field, you provide a callable - datetime.datetime.utcnow to default, so each time the form is instantiated the callable is called and the new result is used.



              In your name field, datetime.datetime.utcnow().timestamp() is evaluated when the form is compiled, so the default value is the same for every instance of the form.



              If you want the default value of name to be evaluated every time the form is instantiated, pass it a function (a callable) that returns datetime.datetime.utcnow().timestamp().



              Like this:



              def get_default():
              datetime.datetime.utcnow().timestamp()


              class MyForm(FlaskForm):
              timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
              name = StringField("Name", default=get_default, validators=[Optional()])


              or if you prefer, you can use a lambda:



              class MyForm(FlaskForm):
              timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
              name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])





              share|improve this answer


























                0












                0








                0







                In your timestamp field, you provide a callable - datetime.datetime.utcnow to default, so each time the form is instantiated the callable is called and the new result is used.



                In your name field, datetime.datetime.utcnow().timestamp() is evaluated when the form is compiled, so the default value is the same for every instance of the form.



                If you want the default value of name to be evaluated every time the form is instantiated, pass it a function (a callable) that returns datetime.datetime.utcnow().timestamp().



                Like this:



                def get_default():
                datetime.datetime.utcnow().timestamp()


                class MyForm(FlaskForm):
                timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
                name = StringField("Name", default=get_default, validators=[Optional()])


                or if you prefer, you can use a lambda:



                class MyForm(FlaskForm):
                timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
                name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])





                share|improve this answer













                In your timestamp field, you provide a callable - datetime.datetime.utcnow to default, so each time the form is instantiated the callable is called and the new result is used.



                In your name field, datetime.datetime.utcnow().timestamp() is evaluated when the form is compiled, so the default value is the same for every instance of the form.



                If you want the default value of name to be evaluated every time the form is instantiated, pass it a function (a callable) that returns datetime.datetime.utcnow().timestamp().



                Like this:



                def get_default():
                datetime.datetime.utcnow().timestamp()


                class MyForm(FlaskForm):
                timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
                name = StringField("Name", default=get_default, validators=[Optional()])


                or if you prefer, you can use a lambda:



                class MyForm(FlaskForm):
                timestamp = DateTimeField("Timestamp", default=datetime.utcnow, validators=[Required()])
                name = StringField("Name", default=lambda : datetime.datetime.utcnow().timestamp(), validators=[Optional()])






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 24 '18 at 15:45









                snakecharmerbsnakecharmerb

                10.6k42250




                10.6k42250
































                    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.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450930%2fwtforms-stringfield-dynamic-default-value-using-datetime-utcnow-callable%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

                    Tonle Sap (See)

                    I get strange results when I access the Sqlitedatabase with Unity C# via XAMPP

                    Guatemaltekische Davis-Cup-Mannschaft