如何在Django中将表单数据保存到我的模型中

时间:2018-12-25 13:38:49

标签: python django

我正在创建一个需要用户名和电子邮件的新闻通讯应用程序。但是每次我输入表格数据。没有变化反映在数据库中

models.py

class NewUsers(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    date_added = models.DateField(auto_now_add= True)

    class Meta:
        verbose_name = "NewUser"
        verbose_name_plural = "NewUsers"

    def __str__(seld):
         return self.email

views.py

def newsletter_subscribe(request):
    if request.method == 'POST' :
        form = NewUserForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name'] #variable to store cleaned data
            email = form.cleaned_data['email']
            instance = NewUsers(name= name, email = email)
            instance.save()
            if NewUsers.objects.filter(email = instance.email).exists():
                print("Your email is already added to our database")
            else:
                instance.save()
                print("Thank you for subscribing")

     else:
        form = NewUserForm()#display empty form
        context = {'form':form}
        template = "index.html"
        return render(request ,template ,context )

这是我的模板代码

  

模板

 <form  method="post" action="{%url 'subscribe'%}">
  {% csrf_token %}
 <label for="id_email_field">Name:</label> <input type="text" 
  name=""
 required="" id="">
<label for="id_email_field">E-mail:</label> <input type="email" 
name="email_field"
 required="" id="id_email_field">
<button id="id_submit" name="submit" value="Subscribe" 
 type="submit">Subscribe
</button>
</form>

1 个答案:

答案 0 :(得分:0)

我注意到几件事:首先,视图必须返回HttpResponse对象。例如,我建议在这里https://docs.djangoproject.com/en/2.1/topics/http/views/和这里https://docs.djangoproject.com/en/2.1/topics/forms/阅读 因此,既然您显然没有指出这一事实而向您抛出错误,所以我认为request.method从未等于“ POST”。也许您可以尝试找出是否是这种情况?因此:请您也提供您的模板代码。

接下来,您在if form.is_valid()中的代码非常人为设计。在这里最自然的事情就是调用form.save()。这将从清理的表单数据中在数据库中创建一个实例。如果需要进行一些调整,可以像这样扩展:

instance = form.save(commit=False)
# add some adjustments (instance.foo = bar)
instance.save()

最后,如前所述,您需要返回一个HttpResponse对象,该对象通常是通过

完成的
return redirect(url_name, ..)

编辑:因为您现在添加了模板代码:请首先让django为您呈现字段:https://docs.djangoproject.com/en/2.1/topics/forms/#rendering-fields-manually 然后看看模板的源代码。我认为您的名称输入字段缺少名称标签,并且您的电子邮件输入字段应具有name =“ email”。您甚至可以让django为您呈现整个表单(请再次参阅文档...)。在输入字段中没有(正确的)名称标签的情况下-无法发送或正确分配用户输入的数据。