required = True 在 Django 表单字段中不生效

问题描述 投票:0回答:2

我想要的是使 DateField 和 CharField 成为必需的,以便表单无法在字段为空的情况下提交,但即使在两者中设置 required = True 后,它也不会生效并最终在保存表单时抛出错误,我不知道哪里错了

这是表单类:

class RepairOrderForm(forms.ModelForm):

    brand = forms.CharField(
        required=True,
        widget=forms.TextInput(
            attrs={
                "placeholder": " e.g DELL",
            }
        )

    )

    model = forms.CharField(
        required=True,
        widget=forms.TextInput(
            attrs={
                "placeholder": "Device model",
            }
        )
    )

    serial_no_or_IMEI = forms.CharField(
        required=True,
        label="Serial No/IMEI",
        widget=forms.TextInput(
            attrs={
                "placeholder": "Device serial No/EMEI",
            }
        )
    )

    fault_details = forms.CharField(
        required=True,
        widget=forms.Textarea(
            attrs={
                "placeholder": " A detailed description of the fault",
            }
        )
    )

    pick_up_date = forms.DateField(
        required=True,
        # initial = datetime.date.today,
        widget=forms.DateTimeInput(

            attrs={
                # "class": "datepicker",
            }
        )
    )

    coupon_code = forms.CharField(
        required=False,
        widget=forms.TextInput(
            attrs={
                "placeholder": "Got a coupon/voucher use it here and get a discount on your repair order",
            }
        )
    )

    survey = forms.CharField(
        required=False,
        widget=forms.Textarea(
            attrs={
                "placeholder": "How did you hear about us",
            }
        )
    )

    terms_and_condition = forms.BooleanField(
        required=True,
        label=' I have read and agree to the'
    )

    class Meta:
        model = RepairOrderModel
        fields = [
            'device_type',
            'brand',
            'model',
            'serial_no_or_IMEI',
            'fault_details',
            'pick_up_date',
            'coupon_code',
            'survey',
            'terms_and_condition'
        ]

这是模型:

class RepairOrderModel(models.Model):
    device_type_choices = [
        ('LAPTOP', 'LAPTOP'),
        ('PHONE', 'PHONE'),
        ('DESKTOP', 'DESKTOP'),
        ('WRISTWATCH', 'WRISTWATCH'),
        ('DRONE', 'DRONE'),
        ('LED/LCD TV', 'LED/LCD TV'),
        ('OTHERS', 'OTHERS'),
    ]
    
    order_tracking_choices = [
        ('PENDING', 'PENDING'),
        ('PICKED UP', 'PICKED UP'),
        ('REPAIR IN PROGRESS', 'REPAIR IN PROGRESS'),
        ('REPAIR DONE', 'REPAIR DONE'),
        ('READY FOR DELIVERY', 'READY FOR DELIVERY'),
        ('DELIVERED','DELIVERED')
    ]
    
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    order_id = models.CharField(max_length=120, default="")
    device_type = models.CharField(max_length=20, choices = device_type_choices, default = 'LAPTOP')
    brand = models.CharField(max_length=120, default="")
    model = models.CharField(max_length=120, default="")
    serial_no_or_IMEI = models.CharField(max_length=120, default="")
    fault_details = models.TextField()
    pick_up_date = models.DateField()
    order_tracking = models.CharField(max_length=50, choices = order_tracking_choices, default = 'PENDING')
    coupon_code = models.CharField(max_length=20, default="")
    survey = models.TextField()
    terms_and_condition = models.BooleanField(default = False)
    order_date = models.DateTimeField(default=timezone.now)
    
    def __str__(self):
        return f'{self.owner.username} Repair Order'

这是视图:

@login_required
def RepairOrderView(request):
    page_tittle = "Repair Order"

    if request.method == 'POST':
        p_u_form = ProfileUpdateForm(
            request.POST, instance=request.user.profile)
        repair_order_form = RepairOrderForm(request.POST)
        repair_order_form.instance.owner = request.user
        if repair_order_form and p_u_form.is_valid():
            p_u_form.save()
            repair_order_form.save()
            username = request.user
            messages.success(
                request,
                f'{username}, Thanks for placing a repair order . Our customer care will be contacting you soon, to confirm and process your request'
            )
            odr_id = RepairOrderModel.objects.all().filter(
                owner=request.user).order_by('-order_date')[0].order_id

            content = f"Thanks for Placing a repair order. Your Order ID is {odr_id} . Our customer care will be contacting you soon, to confirm and process your request"
            html_msg = render_to_string('repairsquad_home_app/email_templates/email.html', context={
                'username': request.user.username,
                'content': content,
            })
            send_mail(
                "REPAIR SQUAD NOTIFICATION",
                f"Hi {request.user.username} Thanks for Placing a repair order. Your Order ID is {odr_id} . Our customer care will be contacting you soon, to confirm and process your request ",
                settings.EMAIL_HOST_USER,
                [request.user.email],
                fail_silently=True,
                html_message=html_msg,
            )

            admin_content = f"THE USERNAME ABOVE PLACE A REPAIR ORDER WITH ORDER ID {odr_id} . PLEASE CHECK IT UP AND PROCESS"
            admin_html_msg = render_to_string('repairsquad_home_app/email_templates/email.html', context={
                'username': request.user.username,
                'content': admin_content,
            })
            send_mail(
                "REPAIR SQUAD NOTIFICATION",
                f"THE USERNAME ABOVE PLACE A REPAIR ORDER WITH ORDER ID {odr_id} . PLEASE CHECK IT UP AND PROCESS",
                settings.EMAIL_HOST_USER,
                [settings.EMAIL_HOST_USER],
                fail_silently=True,
                html_message=admin_html_msg,
            )
            return redirect('profile')
        else:
            messages.error(
                request,
                f'{username}, Please fill the pickup date'
            )
            return redirect('profile')

    else:
        repair_order_form = RepairOrderForm()
        p_u_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'page_tittle': page_tittle,
        'repair_order_form': repair_order_form,
        'p_u_form': p_u_form
    }
    return render(request, 'repairsquad_home_app/repair_order_form.html', context)
python django django-models django-forms django-views
2个回答
1
投票

您还需要拨打

.is_valid()
上的
repair_order_form
。通过写
if repair_order_form and p_u_form.is_valid():
,您可以检查 RepairOrderForm
真实性
。由于
RepairOrderForm
不会覆盖
__bool__
,这意味着它将始终是
True

因此,您将视图写为:

    if request.method == 'POST':
        p_u_form = ProfileUpdateForm(
            request.POST, instance=request.user.profile)
        repair_order_form = RepairOrderForm(request.POST)
        repair_order_form.instance.owner = request.user
        if repair_order_form.is_valid() and p_u_form.is_valid():
            # …

0
投票

3年后...

只是为了消除任何误解:Django 可以处理这个问题,正如 Jephtah 怀疑的那样,只需使用这样的数据列表:

<label for="scoreNo">Score 1-5</label>
<input id="Score" name="Score" type="tel" list="defaultValues" />

<datalist id="defaultValues">
<option value="1"></option>
<option value="2"></option>
<option value="3"></option>
<option value="4"></option>
<option value="5"></option>
</datalist>
© www.soinside.com 2019 - 2024. All rights reserved.