我还为博客创建了一个简单的注册表单,要求用户提供用户名和注册名称。 输入注册号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',)
添加注册号不正确的用户时,我的表单如下所示:
我的错误追溯页面:
我的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 %}
答案 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放在弹出窗口中,并在页面重新加载时检查您的前端代码是否存在任何错误。如果有错误,则显示弹出窗口。
这应该让你开始我想