django表单日期输入字段未显示错误

发布于 2025-02-04 22:52:45 字数 8729 浏览 1 评论 0原文

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

这是表格的样子: 链接到注册形式的图像

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

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 呈现表单 - 我将两种形式组合成一个表格,并用一个按钮/输入提交。这个问题似乎在于第二种形式(员工形式),第一种表单(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')

最后,这是 template 上上呈现注册页面的html的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>

我不确定我还能做些什么来获取表格来提供错误消息如果不正确输入日期,则将其发送给用户。

I have a form on a registration page that requires a date to be entered, along with a few other fields. If the user enters non-valid information into the date field (like a string) and submits the form, Django rejects the form as non-valid, but I don't get any error messages on the page - But for the other fields on the form, I do get error messages (ex: Passwords Don't Match, User Already Registered, etc).

Here is what the form looks like:
Link to image of registration form

Here is my forms.py file - I'm using two classes to create the form on the registration page:

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']

Here is the models.py field with the model for the profile:

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()

And here is the views.py that presents the form - I'm combining two forms into one, and submitting with one button/input. The problem seems to lie with the second form (EmployeeForm), the first form (CustomUserCreationForm) seems to work fine:

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')

And finally here is the html for the form on the template that presents the registration page - as you can see, I've tried a few different ways to get the form to present error messages, but none of them are working for the date field:

                            <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>

I'm not sure what else I can do to get the Form to offer error message to the user if the date is entered incorrectly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萤火眠眠 2025-02-11 22:52:45

通常,最好使用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']

现在,您将看到错误输入有效的日期 error_messages = {'必需/code> to 必需= false没有道理。

views.py可以保持不变。

Generally, it is better to use type='date' instead of type='text' in input, but if you have used so, you can do it its validation from text also.

First thing the hireDate field is from e_form not form.

Try below code:

html file:

 <!--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']

Now, you will see the error enter a valid date and setting error_messages={'required': 'Please enter a valid date'} to a required=False makes no sense.

The views.py can be remain same.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文