【问题标题】:Django Form Date Input Field Not Showing ErrorsDjango 表单日期输入字段不显示错误
【发布时间】:2022-07-08 16:11:04
【问题描述】:

我在注册页面上有一个表单,需要输入日期以及其他一些字段。如果用户在日期字段(如字符串)中输入无效信息并提交表单,Django 将表单视为无效拒绝,但我没有在页面上收到任何错误消息 - 但对于其他字段表单,我确实收到错误消息(例如:密码不匹配、用户已注册等)。

表单如下所示: Link to image of registration form

这是我的 forms.py 文件 - 我使用两个类在注册页面上创建表单:

from django import forms
from users.models import Profile
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta(UserCreationForm.Meta):
        model = User
        #fields = UserCreationForm.Meta.fields + ("email",)
        fields = ['username', 'email', 'password1', 'password2']


class EmployeeForm(forms.ModelForm):

    hireDate = forms.DateField(
        required=False,
        error_messages={'required': 'Please enter a valid date'},
        input_formats=[
            '%Y-%m-%d',  # '2006-10-25'
            '%m/%d/%Y',  # '10/25/2006'
            '%m/%d/%y'
        ])  # '10/25/06')

    class Meta:
        model = Profile
        fields = ['hireDate', 'employeeNumber']

这是 models.py 字段,其中包含配置文件的模型:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    #confirmed = models.BooleanField("Confirmed", default=False)

    hireDate = models.DateField(auto_now=False,
                                auto_now_add=False,
                                verbose_name='Date of Hire',
                                null=True)
    employeeNumber = models.CharField(max_length=10,
                                      verbose_name='Employee Number',
                                      null=True)


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

这是呈现表单的 views.py - 我将两种表单合二为一,并通过一个按钮/输入进行提交。问题似乎在于第二种形式(EmployeeForm),第一种形式(CustomUserCreationForm)似乎工作正常:

from django.contrib.auth import login
from django.shortcuts import redirect, render
from django.urls import reverse
from users.forms import CustomUserCreationForm, EmployeeForm
from users.models import User, Profile
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.contrib import messages  #import messages


def dashboard(request):
    return render(request, "users/dashboard.html")


#@login_required
# @transaction.atomic


def register(request):
    if not request.user.is_authenticated:
        if request.method == 'POST':
            form = CustomUserCreationForm(
                request.POST)  #, instance=request.user)
            e_form = EmployeeForm(
                request.POST)  #, instance=request.user.profile)
            if form.is_valid() and e_form.is_valid():

                user = form.save()
                user.refresh_from_db(
                )  # load the profile instance created by the signal
                e_form = EmployeeForm(request.POST, instance=user.profile)
                e_form.full_clean()
                e_form.save()
                messages.success(request, f'Your account has been approved!')
                return redirect('login')

        else:

            form = CustomUserCreationForm()
            e_form = EmployeeForm()
            print(form.errors)
            print(e_form.errors)

        context = {'form': form, 'e_form': e_form}

        return render(request, 'users/register.html', context)

    else:
        return redirect('dashboard')

最后是 模板 上显示注册页面的表单的 html - 如您所见,我尝试了几种不同的方法来让表单显示错误消息,但它们都不适用于日期字段:

                            <form class="text-center" method="post">
                                {% csrf_token %}
                            
                            
                                <!--Username-->
                                <div class="mb-3"><input class="form-control" type="text" name="username" placeholder="Username" required id="{{ field.id_username }}"</div>
                                <div class="text-danger">
                                   {% for error in form.username.errors %}{{ error }}<br/>{% endfor %}
                                  </div>

                                <!--Email-->
                                <div class="mb-3"></div>
                                <div class="mb-3"><input class="form-control" type="email" name="email" placeholder="Email" required id="{{ field.id_email }}"</div>
                                <div class="text-danger">
                                   <!-- {% for error in form.register.errors %}{{ error }}<br/>{% endfor %} -->
                                </div>

                                <!--Password-->
                                <div class="mb-3"></div>
                                <div class="mb-3"><input class="form-control" type="password" name="password1" autocomplete="password" required id="{{ field.id_password1 }}" placeholder="Password"></div>
                                <div class="text-danger">
                                   {% for error in form.password1.errors %}{{ error }}<br/>{% endfor %}
                                  </div>
                                <!--Password Confirm-->
                                <div class="mb-3"></div>
                                <div class="mb-3"><input class="form-control" type="password" name="password2" autocomplete="password" required id="{{ field.id_password2 }}" placeholder="Confirm Password"></div>
                                <div class="text-danger">
                                  {% for error in form.password2.errors %}{{ error }}<br/>{% endfor %}
                                </div>
                                 <!--Date of Hire -->
                                <div class="mb-3"></div>
                                <div class="mb-3"><input class="form-control" type="text" name="hireDate" autocomplete="Date of Hire" required id="{{ field.id_hireDate }}" placeholder="Date of Hire"></div>
                                <div class="text-danger">
                                   {% for error in form.hireDate.errors %}{{ error }}<br/>{% endfor %}
                                </div>
                                
                                <!-- Employee Number -->
                                <div class="mb-3"></div>
                                <div class="mb-3"><input class="form-control" type="text" name="employeeNumber" autocomplete="Employee Number" required id="{{ field.id_employeeNumber }}" placeholder="Employee Number"></div>
                                <div class="text-danger">
                                   <!-- {% for error in form.register.errors %}{{ error }}<br/>{% endfor %}-->
                                </div>

                                {{ form.non_field_errors }}

                                {% if form.errors %}
                                    {% for field in form %}
                                        {% for error in field.errors %}
                                            <p> {{ error }} </p>
                                        {% endfor %}
                                    {% endfor %}
                                {% endif %} 


                                <input class="btn btn-primary d-block w-100" type="submit" value="Register">
                                
                                

                            <div class="mb-3"></div>
                            <a class="text-muted" href="{% url 'login' %}">Back to Login</a>
                                
                            </form>

如果日期输入不正确,我不确定我还能做些什么来让表单向用户提供错误消息。

【问题讨论】:

  • 更新:在日期字段的模板页面上,我将表单字段类型从“文本”更改为“日期” - 这解决了问题,因为它现在将该字段呈现为仅限日期格式的字段使用日期选择器 - 没有其他类型的输入是可能的。仍然会感谢任何其他 cmet 为什么它以前不起作用。

标签: python django django-models django-views django-templates


【解决方案1】:

一般情况下,输入时最好使用type='date' 而不是type='text',但如果您使用过,也可以从文本中进行验证。

首先hireDate 字段来自e_form 而不是form

试试下面的代码:

html 文件:

 <!--Date of Hire -->
        <div class="mb-3"></div>
        <div class="mb-3">
            {{e_form.hireDate}}
        <div class="text-danger">
           {% for error in e_form.hireDate.errors %}{{ error }}<br/>{% endfor %}
        </div>

forms.py:


class EmployeeForm(forms.ModelForm):

    hireDate = forms.DateField(
        required=False,
        widget=forms.DateInput(
            attrs={'class': 'form-control', 'placeholder': 'Enter Date'}),
        input_formats=(
            '%Y-%m-%d',  # '2006-10-25'
            '%m/%d/%Y',  # '10/25/2006'
            '%m/%d/%y'
        )
    )  # '10/25/06')

    class Meta:
        model = Profile
        fields = ['hireDate', 'employeeNumber']

现在,您将看到错误 enter a valid date 并将 error_messages={'required': 'Please enter a valid date'} 设置为 required=False 没有意义。

views.py 可以保持不变。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2015-01-29
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多