我无法将表单数据保存到 django 中的数据库
Posted
技术标签:
【中文标题】我无法将表单数据保存到 django 中的数据库【英文标题】:I am not able to save the form data to databse in django 【发布时间】:2018-04-16 07:51:12 【问题描述】:我想通过表单添加数据并在我的模板中查看它的查询
博客网址:
urlpatterns = [
url(r'^admin/',admin.site.urls),
url(r'^blog/',include('content.urls',)),
]
内容网址:
urlpatterns = [
url(r'^add/$', views.add_content, name='content'),
]
models.py
from django.db import models
class AddContent(models.Model):
content_name = models.CharField(max_length=100, default='', blank=False, unique=True)
def __str__(self):
return self.content_name
forms.py
from django import forms
from .models import AddContent
class AddContentForm(forms.ModelForm):
class Meta:
model = AddContentModel
fields = [
"content_name",
]
views.py
def add_content(request):
form = AddContentForm(request.POST or None)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return redirect("/blog/content/")
content_data = AddContent.objects.all()
context =
"form":form,
"content":content_data,
return render(request, "add_content.html", context)
def view_content(request):
view_data = AddContent.objects.all()
context =
"show_content":view_data,
return render(request, 'show_content.html', context)
模板: add_content.html
% extends 'base.html' %
% block content %
<form method='POST' action="/blog/content/">
% csrf_token %
form.as_p
<input type='submit' value='Add Content'/>
<h3>Recent content</h3>
% for show in show_content %
<p> show.content_name </p>
% endfor %
% endblock %
表单数据没有被保存,当我通过管理界面添加它时,它给出了结果,但表单失败。
(这只是我在括号中写的一些无用的内容,*** 不允许我发布,因为看起来我的帖子主要是代码;请添加它所说的更多细节,但我认为代码有很多细节我不能写任何东西只是为了篇幅)
【问题讨论】:
为什么是commit=False
?
Ps:您给模型命名的方式不正确。它应该被命名为 Content
你的show_content.html
模板是什么?
@KlausD。因为我习惯了,它以前工作过,最后我把它保存为.save() 写的
@art06 如果将其更改为 Content 会使代码无法正常工作。会吗?
【参考方案1】:
您的模型表单应如下所示
from django import forms
from .models import AddContent
class AddContentForm(forms.ModelForm):
class Meta:
model = AddContent
fields = [
"content_name",
]
您在模型表单的 Meta 类中定义了错误的模型名称。它应该是 AddContent 而不是 AddContentModel
【讨论】:
【参考方案2】:我也是 django 新手,但您不需要在 views.py 中的函数中指定请求,例如:
def add_content(request):
if(request.method == 'POST'):
# rest of code here
【讨论】:
我认为没有必要,我的代码已经多次使用该功能,只是这次我卡住了【参考方案3】:您的表单不会发布到保存数据的视图;它直接发布到 view_content 视图,该视图完全忽略了数据。
您可以将表单操作设置为 "."
以使其回发到呈现它的同一视图。
(另外一点,您应该避免对 URL 进行硬编码。在模板中使用 % url %
标记,在视图中使用 reverse()
函数,以根据视图名称输出 URL。)
【讨论】:
【参考方案4】:首先: 更正表单中的 redirect()。
return redirect("add_content", request.POST= None)
第二:你需要为内容视图指定一个URL:view_content
url(r'^content/$', views.view_content, name='content'),
而且您需要一个模板来呈现内容(show_content.html:
% extends 'base.html' %
% block content %
<h3>Recent content</h3>
% for show in show_content %
<p> show.content_name </p>
% endfor %
% endblock %
编辑:
您的表单定义不明确。我编辑我的答案以使其完整:
您必须更正表单中的模型(AddContent 不是 AddContentModel):
class Meta:
model = **AddContent**
fields = [
"content_name",
]
【讨论】:
以上是关于我无法将表单数据保存到 django 中的数据库的主要内容,如果未能解决你的问题,请参考以下文章