我是Django的新手,正在尝试制作一个简单的博客。我目前正在尝试制作一个仅供管理员使用的表单,允许他们将文章添加到数据库中。但是,我遇到了一个问题,即article.is_valid()一直在失败。我已经研究了一段时间,并将其缩小到与错误列表有关的问题,但我不确定它是什么。
以下是相关代码: views.py
from django.shortcuts import render
from django.http import HttpResponse, HttpRequest, Http404
from .forms import addForm
# Create your views here.
def index(request):
return render(request, 'blogposts/index.html')
def page_add(request):
return render(request, 'blogposts/add.html')
def add(request):
if request.method == "POST":
article = addForm(request.POST)
if article.is_valid():
add_article = article.save()
print "success!"
else:
print article['errorlist']
else:
print "oops"
return render(request, 'blogposts/add.html')
forms.py
from django import forms
from .models import Articles
from django.forms import ModelForm
class addForm(forms.ModelForm):
class Meta:
model = Articles
fields = ['blog_author', 'blog_article', 'blog_date', 'errorlist']
*我已尝试过,无论有没有在forms.py字段中包含的错误列表;我不清楚这是否有必要。如果我这样做,似乎会进一步推进这个过程。
models.py
from __future__ import unicode_literals
from django.db import models
# Create your models here.
# Controls blog post storage
class Articles(models.Model):
blog_author = models.TextField()
blog_article = models.TextField()
blog_date = models.DateField()
errorlist = models.TextField()
class Meta:
db_table = "Articles"
add.html(带有表单的页面)
<!-- Form for adding articles to the database -->
<form action = "/home/add/" method = "post">
{% csrf_token %}
<label for = "article">Article: </label>
<textarea id = "article" name = "article" rows = "20" cols = "100"></textarea>
<label for = "author"> Author: </label>
<select name = "author">
<option value = "Jimmy Liu">Jimmy Liu</option>
<option value = "Ben Hanson">Ben Hanson</option>
</select>
<label for = "date">Date Published: </label>
<input type = "date" name = "date">
<input type = "submit" value = "submit">
</form>
当我运行时,我得到:
else:
print article['errorlist']
我的控制台中的消息。它成功获取数据(它不会打印Oops),但它永远不会将数据保存到我的数据库中。
提前感谢您的任何帮助。
答案 0 :(得分:1)
您创建articleForm的方式是错误的。
最好使用像{{ form.as_p }}
之类的模型表格。
但是如果你真的想在html中创建自定义表单,你应该使用django的标准id
和name
标签。如果字段名称为blog_article
,则相应的html字段的ID应为id_blog_article
。 name属性应为blog_article
。您的名称属性为article
而不是blog_article
。所以这里是html格式的正确文章元素:
<label for="id_blog_article"> Article: </label>
<textarea id="id_blog_article" name="blog_article" rows="20" cols="100"></textarea>
现在,您可以通过以下方式获取表单数据:
if request.method == "POST":
article = addForm(request.POST)
if article.is_valid():
add_article = article.save()
print ("success!")
else:
print ("request data: ", request.POST)
print ("form is not valid")
但是,除非你没有充分的理由,否则使用内置标签渲染表单会更好,更容易。