首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Django模板中呈现ValidationError?

如何在Django模板中呈现ValidationError?
EN

Stack Overflow用户
提问于 2022-07-23 10:53:13
回答 2查看 125关注 0票数 0

我是Django的新手,我请求社区的帮助。

现在我正在做用户注册工作,我想做密码验证:如果密码不被重复,在底部字段下面会出现一条消息。据我所知,必须使用{{ form.errors }}来呈现ValidationError中指定的错误文本,但是当发生此错误时,它的文本不会显示在页面上。请告诉我如何解决这个问题。也许我不太明白Django表单是如何工作的。我尝试了其他答案中提出的解决方案,但不幸的是,到目前为止没有什么效果。谢谢。

forms.py:

代码语言:javascript
运行
复制
from .models import CustomUser

class RegisterUserForm(forms.ModelForm):
    email = forms.EmailField(required=True,
                            label="Адрес электронной почты",
                            widget=forms.EmailInput(attrs={'class': 'form-control',
                                                        'placeholder':'email'}))
    password = forms.CharField(label='Пароль',
                            widget=forms.PasswordInput(attrs={'class': 'form-control',
                                                            'placeholder':'password'})                                                            )
    confirm_password = forms.CharField(label='Пароль(повторно)',
                            widget=forms.PasswordInput(attrs={'class': 'form-control',
                                                            'placeholder':'confirm password'}))


    def clean(self):
        super().clean()
        password = self.cleaned_data['password']
        confirm_password = self.cleaned_data['confirm_password']
        if password != confirm_password:
            raise ValidationError({'confirm_password': 'пароли не совпадают'})


  class Meta:
        model = CustomUser
        fields = ("email", "password", "confirm_password")

views.py:

代码语言:javascript
运行
复制
def sign_up(request):
    if request.method=="POST":
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('pages:index')

    form = RegisterUserForm()
    return render(request=request, template_name="users/sign_up.html", context={'form': form})

模板:

代码语言:javascript
运行
复制
</head>
    <link rel="stylesheet" type="text/css" href="{% static 'users/css/style.css' %}">
<head>

<div class="text-center log-in-bg rounded">
    <img class="mb-4" src="{% static "users/images/logo_sign_in.png" %}" alt="" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal text-dark">РЕГИСТРАЦИЯ</h1>
    <form method="post" class="form-signin">
        {% csrf_token %}
        {{ form.email.label_tag }}
        {{ form.email }}
        {{ form.password }}
        {{ form.confirm_password }}
        {{ form.errors }}

        <button class="btn btn-lg btn-sign-in btn-block">Зарегистрироваться</button>
    </form>
</div>

谢谢你的帮助。我希望我的问题不是太原始--我刚开始学习Django,我可能不知道一些事情=)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-23 13:37:18

错误是存在的。这是更正意见:

代码语言:javascript
运行
复制
def sign_up(request):
    if request.method=="POST":
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('pages:index')
    else:        
        form = RegisterUserForm()
    return render(request, template_name="users/sign_up.html", context={'form': form})

我提出了新的要求。错误的背景被清除了。使用else帮助我保存了这个上下文。另一方面,SamSparx的回答帮助我理解了如何使用add_error。

票数 0
EN

Stack Overflow用户

发布于 2022-07-23 11:57:20

(备选案文1)

一般来说,clean()中的验证错误出现在

代码语言:javascript
运行
复制
{{ form.non_field_errors }} 

...because它们没有链接到特定的字段。在这种情况下,它涉及两个字段。如果将上述内容包含在模板中,并将错误消息修改为.

代码语言:javascript
运行
复制
raise ValidationError('пароли не совпадают')

...then错误应该显示在您的页面上。

(备选案文2)

仔细看,我看到您尝试为confirm_password字段添加一个错误消息。虽然这不是默认的,但是如果您想以这种方式处理它,您可以删除当前的raise ValidationError行,并在您的clean方法中使用下面的内容将错误分配给特定的字段。

代码语言:javascript
运行
复制
self.add_error('confirm_password', 'пароли не совпадают')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73090102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档