我无法将表单数据保存到 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 中的数据库的主要内容,如果未能解决你的问题,请参考以下文章

Django:表单未保存到数据库

Django表单数据未保存到数据库

Django如何在保存到数据库之前连接表格数据

无法将图像上传到 Django 项目,获取表单对象没有属性“保存”

将表单保存到数据库(Django Python)

通过 Django 将表单 POST 到数据库不保存数据