Данные не сохраняются при использовании виджета FIlteredSelectMultiple
forms.py
class RegistrationCreateForm(forms.Form):
player = forms.ModelChoiceField(queryset=Player.objects.all(),
widget=FilteredSelectMultiple("Player", is_stacked=False))
def __init__(self, *args, **kwargs):
super().__init__()
class Meta:
model = Registration
fields = ['player']
@property
def media(self):
w1 = FilteredSelectMultiple("", False)
form_media = forms.Media(js=['js/jsi18n.js'], css={'all': ['css/filtered.css']})
return (w1.media + form_media )
views.py
class RegistrationCreateView(AccessControlMixin, CreateView):
model = Registration
form_class = RegistrationCreateForm
template_name_suffix = '_create'
def has_access(self, user):
return self.can("create_registration", self.tournament)
def get_success_url(self):
return "%s" % reverse("tournaments:detail",
kwargs={"pk": self.kwargs['pk']})
def dispatch(self, request, *args, **kwargs):
"""
Overridden so we can make sure the `Tournament` instance exists
before going any further.
"""
self.tournament = get_object_or_404(Tournament, pk=kwargs['pk'])
return super(RegistrationCreateView,
self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
self.tournament = get_object_or_404(Tournament, pk=self.kwargs['pk'])
context = super(RegistrationCreateView,
self).get_context_data(**kwargs)
context['tournament'] = self.tournament
return context
def form_valid(self, form):
form.instance.tournament = self.tournament
form.instance.created_by = get_request().user
player_institution_relation = PlayerInstitution.objects.filter(Q(player= form.instance.player) & Q(institution = self.tournament.owner))
if player_institution_relation.exists():
number_of_objects = player_institution_relation.count()
if number_of_objects>1:
for player_inst in player_institution_relation[1:]:
player_inst.delete()
else:
PlayerInstitution.objects.create(player=form.instance.player, institution=self.tournament.owner)
return super(RegistrationCreateView, self).form_valid(form)
def get_form(self, *args, **kwargs):
tournament = get_object_or_404(Tournament, pk=self.kwargs['pk'])
form = super(RegistrationCreateView, self).get_form(*args, **kwargs)
#Remove any player that has already a registration
if get_request().user.name_format == 'First name Last name':
form.fields['player'].queryset = tournament.available_players.order_by("first_name","last_name")
else:
form.fields['player'].queryset = tournament.available_players.order_by("last_name","first_name")
return form
forms.py
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% load i18n %}
{% load static %}
{% block extrahead %}
{{ form.media }}
{% endblock %}
{% block content %}
<div class="container">
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<div class="col">
<h2>{% block form_title %}{% endblock %}</h2>
</div>
</div>
<div class="row">
<div class="col mb-5">
<form class="form-horizontal" method="post" action="{% block form_action %}{% endblock %}">
{% csrf_token %}
{{ form|crispy }}
<div class="control-group">
<div class="controls">
<button type="submit" class="btn btn-primary" id="btn-save">{% block form_button %}{% endblock %}</button>
<a class="btn btn-secondary" href="{% block form_cancel_action %}{% endblock %}">Cancel</a>
</div>
</div>
</form>
</div>
</div>
{% endblock %}
Я использую виджет FilteredSelectMultiple для поля внешнего ключа. Он отображает форму так, как я хочу, но когда я выбираю и сохраняю содержимое. Он перенаправляет меня на ту же страницу без сохранения содержимого в базе данных. Я хочу, чтобы выбранные отношения были сохранены в моей регистрационной таблице. Может ли кто-нибудь помочь мне с этим?