【问题标题】:How to save form data to my model in django如何在 django 中将表单数据保存到我的模型中
【发布时间】:2018-12-25 13:38:48
【问题描述】:

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

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>

【问题讨论】:

标签: python django


【解决方案1】:

我注意到几点:首先,视图必须返回一个 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 为您呈现整个表单(再次参见文档...)在输入字段中没有(正确的)名称标签 - 将无法发送或正确分配用户输入的数据。

【讨论】:

  • OP 没有发布表单的代码,所以你不能假设他正在使用 ModelForm。
  • 我正在使用 ModelForm
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 2022-08-20
  • 2018-02-21
  • 2021-06-28
  • 1970-01-01
  • 2021-01-27
  • 2021-05-07
  • 2020-06-17
相关资源
最近更新 更多