Django / inlineformset: переопределить чистый метод, но ошибка проверки не отображается - PullRequest
0 голосов
/ 19 июня 2020

РЕДАКТИРОВАТЬ

Я частично решил свою проблему, добавив условие 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...