【发布时间】:2019-05-06 20:46:30
【问题描述】:
我创建了一个表单,它将接受输入并将输入值保存在数据库(mysql)中。我的forms.py
class postcreation(forms.Form):
post_title = forms.CharField(max_length=200, widget=forms.TextInput(attrs={'name':'post_title'}))
post_name = forms.CharField(max_length=200, widget=forms.TextInput(attrs={'name':'post_name'}))
post_post = forms.CharField(widget=forms.Textarea(attrs={'name':'post_post'}))
我的模型.py
class postdata(models.Model):
title = models.CharField(max_length=200)
name = models.ForeignKey(userdata, on_delete='CASECADE')
post = models.TextField()
def __str__(self):
return self.title
起初我没有使用“attr”值。它没有用。我看到了一个stackoverflow的答案,说我应该。还是没有运气。
我的意见.py
def postinput(request):
if request.method == 'POST':
form = postcreation(request.POST)
if form.is_valid():
inputpost = postdata(title=request.POST['post_title'], name=request.POST['post_name'], post=request.POST['post_post'])
inputpost.save()
return redirect('index')
else:
form = postcreation()
context = { 'form': form }
return render(request, 'firstapp/postinput.html', context)
html模板
<form method="POST" action="{% url 'index' %}">
{% csrf_token %}
{{ form }}
<button type="submit">Post</button>
</form>
我试图通过表单获取输入并将其保存到数据库。但我无法这样做。我不明白为什么。我正在阅读一些教程和一些 stackoverflow 问题。它仍然不起作用。感谢您的帮助。
【问题讨论】:
-
尝试在
context =之前添加print(from.errors)或添加到模板{{form.errors}} -
始终在调试器中检查
request.POST(或通过打印它)以了解发生了什么。是的,@NS0 是正确的,下面的答案是您不应该直接保存 POST 数据,而是使用form.cleaned_data字典来访问这些值。使用 POST 数据会引发黑客攻击。 -
如果
form.is_valid()返回 false,您的视图不会保存。正如@BearBrown 评论的那样,html 模板应该显示表单错误,所以你知道什么时候出了问题。 -
所以您在 HTML 表单中看到了任何错误?还是在您的控制台中?
-
在这个例子中,看起来您正在构建一个表单来创建模型的实例。这没有什么问题,尤其是作为学习练习,但在真正的 Django 项目中,通常的做法是使用内置的
modelform类:docs.djangoproject.com/en/2.2/topics/forms/modelforms
标签: python django django-models django-forms django-views