如何使用 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 表单字段?
如何使用 if 条件将 django 数组元素添加到 js 数组中