РЕДАКТИРОВАТЬ
Я частично решил свою проблему, добавив условие else (application.is_valid () == False)
, но мне нужно просмотреть мой logi c, потому что родительская форма все еще зарегистрировано ...
Я пытаюсь переопределить чистый метод в моем inlineformset (2 поля app_app_nom и app_dro), но не смог. Мне нужно проверить, что тот же app_app_nom не выбран дважды.
1020 * после), я пытаюсь вызывать ошибку каждый раз при отправке формы (если True: поднять ошибку) данные не регистрируются, но сообщение об ошибке не отображается, и меня перенаправляют ...?
views.py
class UtilisateurProjetCreateView(FormView):
template_name = 'project/utilisateurprojet_edit.html'
form_class = UtilisateurProjetCreateForm
def get_form_kwargs(self):
kwargs = super(UtilisateurProjetCreateView, self).get_form_kwargs()
kwargs['request'] = self.request
return kwargs
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
data["utilisateur"] = self.request.user.username # nom de l'utilisateur connecté
data["user_profil"] = self.request.session.get('user_profil') # profil dans le circuit de demande (Investigateur/Moniteur/Super moniteur/Administrateur MTool/Administrateur RedCap Serveur/Administrateur RedCap Tablette)
data["projet"] = get_object_or_404(Projet, pro_ide = self.request.GET['projet'])
data["circuit"] = get_object_or_404(Circuit, pro_ide = self.request.GET['projet'])
if self.request.POST:
data["application"] = ApplicationFormset(self.request.POST)
else:
data["application"] = ApplicationFormset()
return data
def form_valid(self, form):
context = self.get_context_data()
application = context["application"]
circuit = context["circuit"]
user_profil = context["user_profil"]
# self.object = objet utilisateur/projet pour lequel on doit modifier les droits
self.object = form.save(commit=False)
self.object.uti_log = context["utilisateur"]
if user_profil == '7' or user_profil == '6':
# Mise à jour de la table UtilisateurProjet
# Si utilisateur connecté = 'Super moniteur' ou 'admin'
# "validation automatique"
self.object.pro_uti_val = 1
self.object.pro_uti_val_dat = timezone.now()
# self.object.save()
if application.is_valid():
self.object.save()
application.instance = self.object # instance UtilisateurProjet
application.save()
# 'mise à jour' de la base de données
applications = Application.objects.filter(pro_uti_ide_id = self.object.pro_uti_ide)
for app in applications:
# Création des lignes dans ApplicationSuivi / 1 = 'Création' par défaut à la création
ApplicationSuivi.objects.create(app_ide = app, app_sui_dro = app.app_dro, app_sui_sta = 1, app_sui_log = context["utilisateur"], app_sui_dat = timezone.now())
# 'mise à jour' des lignes applications correspondantes dans Application
app.app_sta = 1
app.app_log = context["utilisateur"]
app.app_dat = timezone.now()
app.save()
# informations nécessaires pour l'envoi d'un mail
demandeur = context["utilisateur"]
utilisateur = Utilisateur.objects.get(uti_ide = self.object.uti_ide_id)
projet = context["projet"]
# applications administrateur MTool
app_MTool = application_list(applications,1,1)
# print('app_MTool',app_MTool)
# applications administrateur RedCap
app_RedCap = application_list(applications,2,1)
# print('app_RedCap',app_RedCap)
# envoi des emails
if user_profil == '7' or user_profil == '6':
if len(app_MTool) > 0:
email_demande(1,demandeur,mailing_list(projet,user_profil,1),utilisateur,projet,app_MTool,None)
if len(app_RedCap) > 0:
email_demande(1,demandeur,mailing_list(projet,user_profil,2),utilisateur,projet,app_RedCap,None)
else:
email_demande(1,demandeur,mailing_list(projet,user_profil,1),utilisateur,projet,app_MTool+app_RedCap,None)
else:
return render(self.request, self.template_name, context)
return super().form_valid(form)
def get_success_url(self):
return reverse("project:index_projet")
forms.py
class ApplicationInlineFormSet(BaseInlineFormSet):
def clean(self):
super().clean()
# example custom validation across forms in the formset
for form in self.forms:
# your custom formset validation
# app_app_nom = form.cleaned_data.get('app_app_nom')
if True:
raise ValidationError('You select the same app twice')
else:
# update the instance value.
form.instance.app_app_nom = app_app_nom
NAME = Thesaurus.options_list(2,'fr')
ACCESS = Thesaurus.options_list(3,'fr')
ApplicationFormset = inlineformset_factory(
UtilisateurProjet, Application,
fields=('app_app_nom','app_dro'),
widgets={
'app_app_nom': forms.Select(choices=NAME),
'app_dro': forms.Select(choices=ACCESS)
},
extra=3,
can_delete=True,
formset=ApplicationInlineFormSet
)
шаблон. html
<form id="utilisateureditform" method="POST" class="post-form">
{% csrf_token %}
{{ form|crispy }}
<a style="margin-right: 40px" data-target="" class="" href="{% url 'project:edit_utilisateur' %}">Nouvel utilisateur</a>
<br>
<br><div class="dropdown-divider"></div><br>
<h2>Applications</h2><br><br>
<!-- {{ application|crispy }} --> <!-- curieusement si j'enlève cette ligne le style crispy disparait -->
{{ application.management_form|crispy }}
<div class="row">
<div class="col-6"><p>Nom de l'application</p></div>
<div class="col-5"><p>Droits</p></div>
<div class="col-1"><p></p></div>
</div>
{% for application_form in application %}
<div class="row link-formset">
{% if application_form.instance.pk %}{{ application_form.DELETE }}{% endif %}
<div class="col-6">
{{ application_form.app_app_nom }}
{% if application_form.app_app_nom.errors %}
{% for error in application_form.app_app_nom.errors %}
{{ error|escape }}
{% endfor %}
{% endif %}
</div>
<div class="col-5">
{{ application_form.app_dro }}
{% if application_form.app_dro.errors %}
{% for error in application_form.app_dro.errors %}
{{ error|escape }}
{% endfor %}
{% endif %}
</div>
<div class="hidden">{{ application_form.app_ide }}</div>
</div>
<!-- <br> -->
{% endfor %}
{% if application.non_form_errors %}
{% for error in application.non_form_errors %}
{{ error|escape }}
{% endfor %}
{% endif %}
<br><br>
<button id="ajouter_utilisateur" class="btn btn-primary" type="submit" style="width: 100px;">Valider</button>
<a data-modal data-target="" class="btn btn-danger" href="{% url 'project:index_projet' %}" style="width: 100px;">Annuler</a>
</form>