验证

时间:2016-05-16 22:55:54

标签: python django django-models django-forms

我是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),但它永远不会将数据保存到我的数据库中。

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:1)

您创建articleForm的方式是错误的。

最好使用像{{ form.as_p }}之类的模型表格。

但是如果你真的想在html中创建自定义表单,你应该使用django的标准idname标签。如果字段名称为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")

但是,除非你没有充分的理由,否则使用内置标签渲染表单会更好,更容易。