Résolue

Formulaire de contact ( besoin d'aide :s )

# Résolution d'erreurs # Django # Formulaires

Bonjour,
Je n'arrive pas à faire fonctionner mon formulaire de contact. Je ne comprend pas le message d'erreur qui apparait sur ma page, je ne reçois pas de mail non plus. Mon code se présente comme ceci :

Mon fichier views.py

def index(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['lastname']
            email = form.cleaned_data['email']
            phone = form.cleaned_data['phone']
            message = form.cleaned_data['message']

            EmailMessage(
                'Contact Form Submission from {}'.format(name),
                message,
                '[email protected]',
                ['[email protected]'],
                [],
                reply_to=[email]
            ).send()
            return redirect('index.html')

    else:
        form = ContactForm()
    return render(request, 'index.html', {'form': form})

Mon fichier models.py dans mon app formulaire :

from django import forms
from django.core.validators import EmailValidator

class ContactForm(forms.Form):
    lastname = forms.CharField(max_length=36, label='', widget=forms.TextInput(attrs={'placeholder': 'Nom'}))
    email = forms.EmailField(max_length=36, label='',validators=[EmailValidator()], widget=forms.TextInput(attrs={'placeholder': 'Email'}))
    phone = forms.CharField(max_length=36, label='', widget=forms.TextInput(attrs={'placeholder': 'Téléphone'}))
    message = forms.CharField(label='',widget=forms.Textarea(attrs={'placeholder': 'Votre message'}))

Dans mon fichier settings.py j'ai insérer les variables suivant avec les bonnes informations (normalement ^^ )

EMAIL_BACKEND = 'django.core.mail.backend.smtp.EmailBackend'
EMAIL_HOST = '******t'
EMAIL_HOST_USER = '******'
EMAIL_HOST_PASSWORD = '*******'
EMAIL_PORT = '465'
EMAIL_USE_SSL = True

Une nouvelle page s'ouvre après la validation du formulaire et il y a ce message :
Incomplete response received from application

Mon souci doit sans doute venir de ma fonction index...

Merci pour votre aide.

Yann

Gabriel Trouvé

Mentor

Bonjour Yann,

Juste pour commencer, il y a une raison spécifique à utiliser un EmailValidator sur ton champ EmailField ?

Sinon Django possède ce qu'il faut pour l'envoie d'emails. Personnellement j'utilise les objets Django.

Par exemple :

def contact_view(request):
    user = request.user

    if request.method == "POST":
        form = ContactForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data["email"]
            subject = form.cleaned_data["subject"]
            text = form.cleaned_data["text"]
            send_mail(subject=subject, message=f"De la part de {email} - {text}",
                      recipient_list=["[email protected]"], from_email=None)
            messages.add_message(request, messages.INFO,
                                 "Le message a été envoyé, si vous ne recevez pas d'email "
                                 "de confirmation veuillez vérifier vos spams ou renvoyer votre "
                                 "message en vérifiant bien l'email renseigné svp.")
            return redirect("sav:contact")
    else:
        form = ContactForm(initial={"email": user.email}) if user.is_authenticated else ContactForm()

    return render(request, "sav/contact.html", context={"form": form})

Ici j'utilise send_mail :
https://docs.djangoproject.com/en/5.0/topics/email/

Tu peux tester avec ça ? Je ne fais que récupérer les informations des champs de mon form pour les utiliser avec send_email.

Bonjour Gabriel,

Merci pour ta réponse entre temps j'ai reussi en local à recevoir des mails de mon formulaire ( grande victoire ) mais pas en ligne.... Je t'avoue que EmailValidator, j'ai suivi un tuto en essayant de l'adapté à mon besoin ( sans avoir réellement tout compris ).
Et donc j'ai reussi avec les objects Django et send_mail ( comme dans ton exemple ).
Voici mon code :

class SuccessView(TemplateView):
    template_name = "success.html"


class ContactView(FormView):
    form_class = ContactForm
    template_name = "index.html"

    def get_success_url(self):
        return reverse("success")

    def form_valid(self, form):
        email = form.cleaned_data.get("email")
        subject = form.cleaned_data.get("subject")
        message = form.cleaned_data.get("message")

        full_message = f"""
            Received message below from {email}, {subject}
            ________________________


            {message}
            """
        send_mail(
            subject="Message reçu de",
            message=full_message,
            from_email=settings.DEFAULT_FROM_EMAIL,
            recipient_list=[settings.NOTIFY_EMAIL],
        )
        return super(ContactView, self).form_valid(form)

Par contre j'ai toujours ce message qui apparait sur un page blanche Incomplete response received from application quand je suis en prod... Je farfouille la toile en cherchant une réponse, les choses qui revienne serai un problème d'importation de requête. Alors qu'en local sa fonctionne parfaitement.
Si quelqu'un à une idée ? je suis prenneur :)

Problème résolue je me suis emmêlé les path ! (sans faire de jeu de mot ^^)

Merci gabriel !

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.