我正在创建一个需要用户名和电子邮件的新闻通讯应用程序。但是每次我输入表格数据。没有变化反映在数据库中
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>
答案 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为您呈现整个表单(请再次参阅文档...)。在输入字段中没有(正确的)名称标签的情况下-无法发送或正确分配用户输入的数据。