如何使用 Django 将表单中的数据添加到数据库中

Posted

技术标签:

【中文标题】如何使用 Django 将表单中的数据添加到数据库中【英文标题】:How to add data from a form into a database with Django 【发布时间】:2015-05-21 00:46:57 【问题描述】:

我正在尝试使用 Django 制作的表单将一些数据添加到我的数据库中。

型号:

class Image(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    picture = models.ImageField(upload_to="images/", null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, null=True, blank=True)
    album = models.ForeignKey('Album', null=True, blank=True)
    description = models.TextField(blank=True, null=True)
    visible = models.BooleanField(blank=False, null=False, default=False)

    def __str__(self):
        return self.name

如您所见,模型的属性比我现在尝试上传的要多,仅用于测试目的。

观点:

def create(request):
if request.POST:
    form = ImageForm(request.POST, request.FILES)
    if form.is_valid():
        name = form.cleaned_data['name']
        dexcription = form.cleaned_data['description']
        visible = form.cleaned_data['visible']
        image = Image.objects.create(
            name = name,
            description = description,
            visible = visible,
        )




        #form.save()

        #return render_to_response('imageall.html',context, context_instance=RequestContext(request))
        return HttpResponseRedirect('/index/')

else:
    form = ImageForm()

args = 
args.update(csrf(request))

args['form'] = form

return render_to_response('create_image.html', args, context_instance=RequestContext(request))

您可以看到我一直在摆弄视图的“保存”部分。 我猜form.save() 是最简单的方法,但这也行不通。

当然还有形式:

from django import forms
from forpix.models import Image
from forpix.models import Album
from django.contrib.auth.models import User


class ImageForm(forms.ModelForm):

    class Meta:
        model = Image
        fields = ('name', 'description', 'visible')

主要的urls.py:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^accounts/login/$', 'mysite.views.login'),
    url(r'^accounts/auth/$', 'mysite.views.auth_view'),
    url(r'^accounts/logout/$', 'mysite.views.logout'),
    url(r'^accounts/loggedin/$', 'mysite.views.loggedin'),
    url(r'^accounts/invalid/$', 'mysite.views.invalid_login'),
    url(r'^accounts/register/$', 'mysite.views.register_user'),
    url(r'^accounts/register_success/$', 'mysite.views.register_success'),

    url(r'^image/(?P<image_id>\d+)/$', 'forpix.views.showimage', name='image_url'),

    url(r'^create/$', 'forpix.views.create'),
    url(r'^$', 'forpix.views.index'),
    url(r'^index/$', 'forpix.views.index'),
    url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

以及应用的 urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^(?P<image_id>\d+)/$', views.results, name='results'),

    )

现在,如果我测试一下,我可以查看并填写表格。 当我提交时,终端显示一条http消息

"POST /index/ HTTP/1.1" 200 3552

页面重定向到我的索引页面,但是当我查看我的数据库时,没有添加任何内容。

谁能解释一下我做错了什么?

我正在使用 Python 3.4 我在win7 我猜数据库是一个sqllite

【问题讨论】:

帖子中的代码中有一个错字:描述而不是描述-我很惊讶这不会引发错误,除非错字仅在您的帖子中-在这种情况下您可以更正吗 你如何检查你的数据库? @ger.s.brett 修正了错字,但并没有改变任何事情。 @DanielRoseman 通过我浏览器中的管理页面。 正如我所说,您似乎发布到 /index/ 而不是 /create/。这可能在您的 create_image.html 模板本身的表单标签中。 【参考方案1】:

你能打印form.error()吗?这会将错误打印到你的终端,我假设你的代码在你的IDE中正确缩进,因为它不在这里。该表单仅在表单有效form.is_valid() 时保存,并且您没有为无效时进行任何返回。

def create(request):
    if request.POST:
         form = ImageForm(request.POST, request.FILES)
         if form.is_valid():
             name = form.cleaned_data['name']
             description = form.cleaned_data['description']
             visible = form.cleaned_data['visible']
             image = Image.objects.create(
                      name = name,
                      description = description,
                      visible = visible,
                        )
             form.save()
             return HttpResponseRedirect('/index/')
         else:
             print(form.error())

             

    else:
       form = ImageForm()


       return render_to_response('create_image.html', args, 
                 context_instance=RequestContext(request))

【讨论】:

以上是关于如何使用 Django 将表单中的数据添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何将引导类添加到模板中的 Django CreateView 表单字段?

使用注册表单添加到自定义用户字段(django)

如何将表单控件添加到 Django 表单?

如何使用 if 条件将 django 数组元素添加到 js 数组中

如何将类、id、占位符属性添加到 django 模型表单中的字段

我无法将表单数据保存到 django 中的数据库