像弹出窗口一样显示验证错误,而不是在Django中加载另一个页面

时间:2017-04-16 07:24:02

标签: python django validation

I just like the way django displays an error message like this

我还为博客创建了一个简单的注册表单,要求用户提供用户名和注册名称。 输入注册号django的无效条目时,默认情况下会将我重定向到显示无法创建对象的页面,因为无法验证数据。 如何在类似的弹出窗口中显示“无效注册号”,而不是重定向到该页面。

我的views.py

def post_new(request,):
if request.method=="POST":
    authorform=NewAuthor(request.POST)
    form=NewPost(request.POST)
    if form.is_valid() and authorform.is_valid():
        new_post=form.save(commit=False)
        new_author=authorform.save(commit=False)
        new_post.published_date=timezone.now()
        new_author.save()
        new_post.author=new_author
        new_post.save()
        return redirect('post_detail',pk=new_post.id)
else:
    form=NewPost()
    authorform=NewAuthor()
    return render(request,'justablog/post_new.html',{'form':form,'authorform':authorform})

我的models.py

from django.db import models
from django.utils import timezone
# Create your models here.
from django.core.validators import RegexValidator
class Author(models.Model):
    Username=models.CharField(max_length=30)
    RegNo=models.CharField(max_length=9,validators=[RegexValidator(
        regex=r'^[0-9]{2}[A-Z]{3}[0-9]{4}',
        message=("Invalid Registration Number"),
        code='invalid_regno'
),])
    def __str__(self):
        return self.Username+'('+self.RegNo+')'
class Post(models.Model):
    title = models.CharField(max_length=50)
    body = models.TextField(max_length=1000)
    author = models.ForeignKey(Author,null=True)
    published_date=models.DateTimeField(blank=True,null=True)
    def publish(self):
        self.published_date=timezone.now()
        self.author.save()
        self.save()
    def __str__(self):
        return self.title

我的forms.py;

class NewPost(forms.ModelForm):
    class Meta:
        model=Post
        fields=('title','body',)
class NewAuthor(forms.ModelForm):
    class Meta:
        model=Author
        fields=('Username','RegNo',)

添加注册号不正确的用户时,我的表单如下所示:

enter image description here

我的错误追溯页面:

enter image description here

我的post_new.html:

{% extends 'justablog/base.html' %}
{% block content %}
<h1>Add a new post</h1>
<form method="POST" class="post-form">
{% csrf_token %}
{{ form.as_p }}
{{ authorform.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}

1 个答案:

答案 0 :(得分:0)

您的视图代码中存在错误。您检查表单是否有效,但不检查authorform是否也有效。所以django抱怨你正在尝试保存authorform而不先验证它。您的if语句应检查两个表单是否有效。

编辑: 现在是前端,回答你原来的问题。

您可能希望手动呈现表单,而不是使用form.as_p。您可以循环遍历表单的各个字段,并显示每个字段的错误,如下所示:

<form>
{% csrf_token %}
{% for field in form %}
    <div class="popup">
    {{ field.errors }}
    </div>
    {{ field.label_tag }} 
    {{ field }}
    </div>
{% endfor %}
</form>

因此,您将field.errors放在弹出窗口中,并在页面重新加载时检查您的前端代码是否存在任何错误。如果有错误,则显示弹出窗口。

这应该让你开始我想