Reputation: 4069
I am stuck with this error and I don't know what to do...
I followed the Django documentation here
I would like also to create a new Player object when I fill the empty extra form, but one requires field of the model must be based on request.user.team not seated directly by the user
Hope someone is familiar with ManagementForm
My files:
views.py
from django.shortcuts import render, redirect
from skeleton.models import Player
from django.contrib.auth.decorators import login_required
from .forms import PlayerForm
from django.forms import modelformset_factory
# Create your views here.
@login_required(login_url="/accounts/login/")
def team_area(request):
PlayerFormSet = modelformset_factory(Player, fields=('first_name', 'last_name'), extra=1)
if request.method == "POST":
player_formset = PlayerFormSet(
request.POST,
request.FILES,
queryset=Player.objects.all().filter(team=request.user.team),)
if player_formset.is_valid():
player_formset.save()
return redirect('team_area:home')
else:
player_formset = PlayerFormSet(queryset=Player.objects.all().filter(team=request.user.team))
return render(request, 'team_area/team_area.html', {'player_formset': player_formset})
team_area.html
{% extends 'base_layout.html' %}
{% block content %}
<h1>Area Squadra</h1>
<form method="post" action="">
{% csrf_token %}
{{ formset.management_form }}
{% for player_form in player_formset %}
{% for field in player_form %}
{{ field.label_tag }} {{ field }}
{% endfor %}
<br>
{% endfor %}
<input type="submit" value="Aggiorna">
</form>
{% endblock %}
Upvotes: 1
Views: 2962
Reputation: 4069
This is the solution I found and used using
.save(commit=False)
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()
Upvotes: 0
Reputation: 101
A formset may contain more then a single form, so for saving the data from a formset in the view file, you have to loop through all the forms and save each form's data. Like in your views.py file you can write:
if player_formset.is_valid():
for form in player_formset: form.save()
This will create as many new objects of Player as there are new forms in the formset (assuming you have not deleted any form or edited the pre-existing form).
One must also update the Management Form data in the .html file as soon as the user clicks on Add Player button
Upvotes: 2