【问题标题】:How to make use of two buttons with two different actions in the same form?如何以相同的形式使用具有两个不同动作的两个按钮?
【发布时间】:2019-05-27 00:26:44
【问题描述】:

我有一个有两个按钮/输入的表单。

Button1 保存页面并刷新它。

Button2 保存页面并转到另一个 url。

Button1 正在使用 type="submit",然后 view.py 获取数据,保存并刷新数据。

我的问题在于 Button2。我用 formaction="{% url 'team_area:home' %}" 添加了它,实际上重定向了我,但问题是它不保存数据。 Button1 仍然可以正常工作。

是否可以在 view.py 中使用某种 request.the_id_of_pressed_button?


如果有帮助的话,这里涉及到我的文件:

修改播放器.html

<h1>AREA SQUADRA</h1>
<form method="post" action="">
  {% csrf_token %}
  <h2>Giocatori</h2>
  {{ player_formset.management_form }}
  {% for player_form in player_formset %}
    {% if forloop.last %}
      {% if not forloop.first %}
        <input type="submit" value="Salva" formaction="{% url 'team_area:home' %}">
      {% endif %}
      <h5>Nuovo giocatore:</h5>
    {% endif %}
    {% for field in player_form %}
      {% if forloop.revcounter == 2 %}
        {{ field }}
      {% elif forloop.parentloop.last and forloop.last%}
      {% else %}
        {{ field.label_tag }} {{ field }}
      {% endif %}
    {% endfor %}
      <br>
  {% endfor %}
  <input type="submit" value="Aggiungi">
  </form>

views.py

@login_required(login_url="/accounts/login/")
def modify_players(request):
    if request.user.team is not None:
        PlayerFormSet = modelformset_factory(Player, form=PlayerForm, extra=1, can_delete=True,)

        if request.method == "POST":
            player_formset = PlayerFormSet(request.POST, request.FILES, queryset=Player.objects.all().filter(team=request.user.team),)
            for player_form in player_formset:
                if player_form.is_valid():
                    player = player_form.save(commit=False)
                    player.team = request.user.team
            if player_formset.is_valid():
                player_formset.save()

            return redirect('team_area:modify_players')
        else:
            player_formset = PlayerFormSet(queryset=Player.objects.all().filter(team=request.user.team))
        return render(request, 'team_area/modify_players.html', {'player_formset': player_formset})
    else:
        return redirect('team_area:home')

【问题讨论】:

  • 你想做什么?为什么需要两个提交按钮?我问是因为可能有比添加两个按钮更好的解决方案。
  • @xyres 我需要当我按下它们时都保存数据,但第一个带我到一个页面,第二个带我到另一个页面
  • 事实类似于admin Django app 如何修改模型。有“保存”和“保存并继续编辑”按钮

标签: python html django forms django-forms


【解决方案1】:

您的 cmets 清理了几件事情。

input 中删除formaction,以便两个按钮将表单提交到同一个视图。

给两个按钮一个共同的name,但不同的value。然后在您的视图中,您可以区分单击了哪个按钮。

html:

<input type="submit" name="submit_button" value="button1">
<input type="submit" name="submit_button" value="button2">

查看:

def modify_players(...):
    ...
    # save data
    ...

    submit_button = request.POST.get('submit_button')
    if submit_button == 'button1':
        # refresh page
    else:
        # redirect to some page

【讨论】:

  • 正是我正在寻找的!我会问你:如果我没有为 设置名称,它是如何通过 request.POST 传递的?我可以使用 get() 吗?
  • @LorenzoFiamingo 没有name 属性,输入的值不会发送到后端。虽然,如果是type="submit",表单将被提交。
猜你喜欢
  • 2014-12-03
  • 2012-06-05
  • 2021-12-19
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多