【问题标题】:Django forms validation is not showing up in the template模板中未显示 Django 表单验证
【发布时间】:2018-08-21 14:51:58
【问题描述】:

我的问题是,当我验证表单是否有错误时,会显示一些带有警告的文本​​,但 id 不会。我正在寻找一些好的答案,我也尝试了所有方法。

我试图在我的注册子页面中实现验证,所以......

首先是我用于注册的model.py

from django.db import models


class User(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField(max_length=30)
    password = models.CharField(max_length=30)

    def __str__(self):
        return "Login: " + self.name + \
               " | e-mail: " + self.email + \
               " | password: " + self.password

其次是带有简单验证的 inputForms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib import messages
from .models import User


class NewUser(forms.Form):
    name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    password = forms.CharField(widget=forms.PasswordInput, required=True)
    pic1 = forms.CharField(required=True)
    pic2 = forms.CharField(required=True)
    pic3 = forms.CharField(required=True)
    pic4 = forms.CharField(required=True)
    pic5 = forms.CharField(required=True)

    class Meta:
        model = User
        fields = ('name', 'email', 'password')

    def clean_email(self):
        email_passed = self.cleaned_data.get('email')
        email_req = "yourdomain.com"
        if not email_req in email_passed:
            raise forms.ValidationError("Not a valid email. Please try again")
        return email_passed

第三是我的观点.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from definitions import SITE_ROOT
from .models import User
from . import inputForms
from threading import Thread
import base64
import re
import os


def index(request):
    if request.method == 'GET':
        return render(request, 'register.html', {'NewUser': inputForms.NewUser})
    else:
        return HttpResponseRedirect('/Kniznica')


def new_user(request):
    if request.method == 'POST':
        form = inputForms.NewUser(request.POST)
        if form.is_valid():
            user_name = form.cleaned_data['name']
            user_email = form.cleaned_data['email']
            user_password = form.cleaned_data['password']
            thread = Thread(target=save_user, args=(form, user_name, user_email, user_password, ))
            thread.start()
            return HttpResponseRedirect('/Kniznica')
        else:
            return render(request, "register.html", {'NewUser': inputForms.NewUser})


def save_user(form, user_name, user_email, user_password):
    base_to_png(form.cleaned_data['pic1'], user_name, "face1.png")
    base_to_png(form.cleaned_data['pic2'], user_name, "face2.png")
    base_to_png(form.cleaned_data['pic3'], user_name, "face3.png")
    base_to_png(form.cleaned_data['pic4'], user_name, "face4.png")
    base_to_png(form.cleaned_data['pic5'], user_name, "face5.png")
    user_instance = User.objects.create(name=user_name, email=user_email, password=user_password)
    user_instance.save()


def base_to_png(base64_string, name, image_name):
    string_without_header = re.sub('^data:image/.+;base64,', '', base64_string)
    img_data = base64.b64decode(string_without_header)
    if not os.path.exists(SITE_ROOT + "/faceId/" + name):
        os.makedirs(SITE_ROOT + "/faceId/" + name)
    filename = SITE_ROOT + "/faceId/" + name + "/" + image_name
    with open(filename, 'wb') as f:
        f.write(img_data)
    os.chdir(SITE_ROOT + "\static\scripts")
    os.system("node face-detection.js " + name + " " + image_name)

第四个是我用于注册的template.html

<div>
    <form action="newUser" method="post" novalidate>
        {% csrf_token %}
        {{ form.non_field_errors }}
        {{ form.username.errors }}
        {% if form.errors %}
            {% for field in form %}
                {% for error in field.errors %}
                    <p> {{ errors }} </p>
                {% endfor %}
            {% endfor %}
        {% endif %}
        <div style="display: inline-block">
            Meno:{{ NewUser.name }}
        </div>
        <div style="display: inline-block">
            Email:{{ NewUser.email }}
        </div>
        <div style="display: inline-block">
            Heslo:{{ NewUser.password }}
        </div>
        <div hidden>
            {{ NewUser.pic1 }}
            {{ NewUser.pic2 }}
            {{ NewUser.pic3 }}
            {{ NewUser.pic4 }}
            {{ NewUser.pic5 }}
        </div>
        <div>
            <video id="video" width="300" height="300" autoplay></video>
        </div>
        <div>
            <p id="counter"></p>
            <button type="button" id="snap">Snap Photo</button>
            <button type="submit" id="save" name="register">Registrácia</button>
        </div>
        <canvas hidden id="canvas" width="640" height="480"></canvas>
    </form>
</div>

【问题讨论】:

  • 拜托!不要将代码发布为屏幕截图,尤其是当有 4 个屏幕截图时。甚至没有人会这样看你的问题
  • 我的答案已编辑。
  • 您认为有些奇怪。显示该函数的其余部分。
  • 我编辑了 view.py 代码并添加了整个文件。

标签: django forms validation templates


【解决方案1】:

您在这里有一个不寻常的视图结构 - 通常您会使用相同的视图来显示初始表单,就像处理提交和显示错误一样。

但是,您确实有几个明显的问题。首先,在您的 new_user 视图中,当表单无效时,您不会发回该无效表单,而是发送表单类本身。无论如何,您应该始终发送表单的一个实例,在这种情况下,您应该发回您已经验证过的同一个实例,因为这就是错误所在:

return render(request, "register.html", {'NewUser': form})

其次,在您的模板中,您对表单的称呼不一致。渲染字段时,您可以通过NewUser 访问它。但是在尝试显示错误时,出于某种原因,您将其称为form。由于您在从视图发送时使用了名称 NewUser,因此您应该使用它来显示错误:

{{ NewUser.errors }}

【讨论】:

  • 如果可以,再问一个问题。如何在特定输入字段下打印特定错误?每个错误都有一些 id 吗?
  • 当然,您可以通过字段本身访问它们 - 例如,{{ NewUser.name.errors }} 用于名称字段。
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 2014-08-12
  • 2018-05-30
  • 2018-11-30
  • 2017-10-20
  • 2016-08-21
  • 2012-04-05
相关资源
最近更新 更多