NakedPython
NakedPython

Reputation: 930

Flask get and edit values

I've got a site where I display specific values of a stock in a table and then should be able to change those values again when clicking on a button, that opens a modal with a form inside.

Now this is my first flask app and I’ve got a problem in overwriting my “original” data with the new Data I’m getting from my form. I don't really know how I can do that. My code looks like this:

views.py

@app.route("/stock-editor", methods=['GET', 'POST'])
def stock_editor():
        index = Index(initial_date=app.config['INCEPTION_DATE'], initial_value=10000)
        end_date = datetime.today()
        start_date = app.config['INCEPTION_DATE']
        empty_stocks = dict()

        for symbol, shares in index.share_distribution.items(): # Here I get every empty stock and put inside a dict so that I can show it on my page
            stock_value = StockValue.query.filter(StockValue.value_eur == 0.000000, StockValue.identifier == symbol, StockValue.date <= end_date, StockValue.date >= start_date).all()
            if stock_value:
                empty_stocks[symbol] = stock_value

        if request.method == 'POST': # this is where I am failing, more info below
            result = request.form
            new_stock_value = request.values.get('new-stock-value')
            new_source_value = request.values.get('new-source-value')

            return render_template('stock-editor.html', result=result, empty_stocks=empty_stocks, start_date=start_date, end_date=end_date, new_stock_value=new_stock_value, new_source_value=new_source_value)
        else:
            return render_template('stock-editor.html', empty_stocks=empty_stocks, start_date=start_date, end_date=end_date)

The html:

<table class="table">
                <tbody>
                    {% for symbol, stock_values in empty_stocks.items() %}
                            <tr class="table-active">
                                <th>Aktie</th>
                                <th>Datum</th>
                                <th>Wert</th>
                                <th colspan="2">Quelle</th>
                            </tr>
                            {% for value in stock_values %}
                                <tr>
                                    <th>{{ symbol }}</th>
                                    <td>{{ value.date.strftime('%d.%m.%Y')}}</td>
                                    <td>{{ '%d' % value.value_eur }}</td>
                                    <td>{{ value.source }}</td>
                                    <td>
                                        <button type="button" class="btn btn-success" data-toggle="modal" data-target="#modal-{{ value.id }}">Bearbeiten <i class="fas fa-pencil-alt"></i></button>

                                        <!-- The Modal -->
                                        <div class="modal fade" id="modal-{{ value.id }}">
                                          <div class="modal-dialog">
                                            <div class="modal-content">

                                              <!-- Modal Header -->
                                              <div class="modal-header">
                                                <h4 class="modal-title">Aktie bearbeiten</h4>
                                                <button type="button" class="close" data-dismiss="modal">&times;</button>
                                              </div>

                                              <!-- Modal body -->
                                              <div class="modal-body">
                                                  <form method="POST">
                                                      <label for="new-stock-value" class="col-form-label">Neuer Wert:</label>
                                                      <input type="number" name="new-stock-value" class="form-control" id="new-stock-value" placeholder="{{ '%d' % value.value_eur }}">
                                                      <label for="new-source-value" class="col-form-label">Quelle:</label>
                                                      <input type="text" name="new-source-value" class="form-control" id="new-source-value" placeholder="{{ value.source }}">

                                                      <!-- Modal footer -->
                                                      <div class="modal-footer">
                                                          <button type="submit" class="btn btn-success">Ändern</button>
                                                          <button type="button" class="btn btn-danger" data-dismiss="modal">Abbrechen</button>
                                                      </div>
                                                  </form>
                                              </div>

                                            </div>
                                          </div>
                                        </div>

                                    </td>
                                </tr>
                            {% endfor %}
                    {% endfor %}
                </tbody>
            </table>

So in the if request.method == 'POST' I am getting my new values (new_stock_value and new_source_value) but I’m a little lost in HOW to actually set them as the new value of the stock where I am setting those new values?

Upvotes: 1

Views: 1157

Answers (1)

George J Padayatti
George J Padayatti

Reputation: 898

Add a hidden field like below to the modal form,

<input type='hidden' name='id' value='{{ value.id }}'>

The above code snippet allows you to send the id of the current stock which is being edited. And in the route you can grab this id by,

id = request.values.get('id')

Using this id, update the empty_stocks dictionary with the new value of stock.

for symbol, stock_values in empty_stocks:
    for value in stock_values:
        if value.id == id:
            value.value_eur = request.values.get('new-stock-value')
            value.source = request.values.get('new-source-value')
            break

I hope this helped you.

Upvotes: 3

Related Questions