Search code examples
flaskjinja2

Flask Jinja Macro: How can I have dynamic parameter name in URL_FOR?


{% macro dynamic(dynamic_param_name) %}
  ...
  <form action="{{ url_for('main.index', dynamic_param_name=1) }}" method="post">
  ...
{% endmacro dynamic %}

like: {{ dynamic_param_name }}=1


Solution

  • url_for accepts kwargs after first argument.

    {% macro dynamic(**kwargs) %}
      ...
      <form action="{{ url_for('main.index', **kwargs) }}" method="post">
      ...
    {% endmacro dynamic %}
    

    When you need it, you can call it like this dynamic(dynamic_first=1, dynamic_second=2).

    edit:

    If what you need is only to change the argument name dynamically, I think you could do it like this:

    {% macro dynamic(param_name) %}
    {% set keyname={param_name:1} %}
      <form action="{{ url_for('main.index', **keyname) }}" method="post">
    {% endmacro dynamic %}