Django表格保存在数据库中并使用formspree.io发送电子邮件

时间:2017-07-19 10:51:59

标签: django email django-forms

我正在寻找为我的公司设置票务服务,我在Django表格和Formspree.io之间遇到了一些问题。

用户使用我的Django表单创建票证。然后,他们的门票存储在我的数据库中,我的应用程序通过Formspree向support@mycompany.fr发送电子邮件。

当我点击submit button时,邮件会很好地发送到我的电子邮件地址,但数据不会保存在我的数据库中。到目前为止,我还没有办法完成这个过程......

我的模特看起来像:

class Ticket(models.Model):

    Etat = models.CharField(max_length = 30, choices = CHOIX_ETAT_TICKET, verbose_name="Etat du ticket")
    Nom = models.CharField(max_length=40, verbose_name="Nom du createur")
    Prenom = models.CharField(max_length=40, verbose_name="Prenom du createur")
    Telephone = models.CharField(max_length=20, verbose_name='Téléphone')
    Mail = models.CharField(max_length=40, verbose_name='Email')
    Objet = models.CharField(max_length=60, verbose_name='Objet du ticket')
    Description = models.CharField(max_length=250, verbose_name='Description du ticket')
    Creation = models.DateTimeField(auto_now_add=True)
    Utilisateur = models.CharField(max_length=100, verbose_name="Utilisateur")

我的表单如下:

class TicketFormulaire(forms.ModelForm):

    Utilisateur = forms.CharField(widget=forms.HiddenInput())
    Etat = forms.CharField(widget=forms.HiddenInput())

    class Meta :
        model = Ticket
        fields = ["Etat", "Nom", "Prenom", "Telephone", "Mail", "Objet", "Description", "Utilisateur"]

我的观点如下:

@login_required
def Identity_Ticket(request) :

    if request.method == 'POST':

        form = TicketFormulaire(request.POST or None)

        if form.is_valid() :   # Vérification sur la validité des données
            post = form.save()

            messages.success(request, 'Le formulaire a été enregistré !')
            #return HttpResponseRedirect(reverse('Home'))

        else:
            messages.error(request, "Le formulaire est invalide !")

    else:
        form = TicketFormulaire()

        form.fields['Utilisateur'].initial = request.user.last_name + " " + request.user.first_name
        form.fields['Etat'].initial = 'En attente'
    return render(request, 'Identity_Societe_Ticket.html', {"form" : form, })

最后是我的html模板:

<h4 class="subtitle"><b> <span class="glyphicon glyphicon-user"></span></span> Création d'un nouveau ticket</b></h4>

    <form autocomplete="off" class = "form" method='POST' action='https://formspree.io/support@mycompany.fr'> {% csrf_token %} <br></br>
        {{ form.as_p}} 
        <br></br>

        <input type="submit" value="Enregistrer le ticket" onclick="return confirm('Valider le formulaire ?')" /> 
    </form>

您是否有第一次在我的数据库中保存数据的解决方案,然后发送电子邮件?

任何帮助都可以欣赏;)

______________ 更新: ______________

我的HTML文件如下:

<h4 class="subtitle"><b> <span class="glyphicon glyphicon-user"></span></span> New ticket</b></h4>

    <form autocomplete="off" class = "form" method='POST' action='' enctype="multipart/form-data"> {% csrf_token %} <br></br>    
        {{ form.as_p}} 
        <br></br>

        <input type="submit" onclick="return confirm('Confirm the ticket ?')" /> 
    </form>

    <script>
        var $TicketForm = $('#someid');
        $TicketForm.submit(function(e) {
            e.preventDefault();
            $.ajax({
                url: '//formspree.io/support@mycompany.fr',
                method: 'POST',
                data: $(this).serialize(),
                dataType: 'json',
                beforeSend: function() {
                    $TicketForm.append('<div class="alert alert--loading">Envoi du ticket en cours</div>');
                },
                success: function(data) {
                    $TicketForm.find('.alert--loading').hide();
                    $TicketForm.append('<div class="alert alert--success">Le ticket a été envoyé ! </div>');
                },
                error: function(err) {
                    $TicketForm.find('.alert--loading').hide();
                    $TicketForm.append('<div class="alert alert--error">Il semble y avoir une erreur</div>');
                }
            });
        });
    </script> 

如果我未在id="someid"中添加<form>,则数据会保存在我的数据库中,并且不会发送电子邮件,但如果我写id="someid",则会发送电子邮件但不会发送数据保存在我的数据库中...问题出在那里......

2 个答案:

答案 0 :(得分:2)

你已经给了action='https://formspree.io/support@mycompany.fr' 表单中的参数,以便您的表单提交到formspree.io站点。而不是使用您的应用程序功能URL提交表单,并在保存表单后在django视图中执行formspree.io处理。

修改 我不知道formspee.io,但我理解你的查询, 一种方法是使用ajax,

更改为

<button type="button" id="someid">

而不是

<input type="submit" />

$("#someid").on("click", function() {
    $.ajax({
        url: "//formspree.io/youremail@gmail.com", 
        method: "POST",
        data: {message: "hello!","extradatagoeshere":""},
        dataType: "json",
        success:function(data)
        {
          // now submit your actual form to db by form.submit();
        }
    });
});

或者使用python请求库在表单保存的查看功能逻辑后发布数据,

import requests
url = 'https://formspree.io/support@mycompany.fr'

data = {"yourdata":"data"} # pass a whole bunch of dict which needed to be send in data

requests.post(url, data=data)

答案 1 :(得分:1)

您的操作是将数据发布到formspree网站,而不是发布到您网站的视图,因此您永远无法获取数据并将其保存到数据库中。

如果你真的想这样做,一种方法是使用ajax点击提交按钮将数据发布到django view,你可以在{id中添加button 1}}并检查onclick将调用ajax

表格将保持不变。

希望这可以帮助你