为什么 form.is_valid return 是假的。请指教

Why does form.is_valid return false. Please advice

我有一个项目,其中在线预订房间然后被定向到结帐页面,您在该页面输入后端所需的 phone。代码如下:

forms.py

from django import forms

class AvailabilityForm(forms.Form):

    check_in = forms.DateTimeField(input_formats=['%Y-%m-%dT%H:%M'], required=True)
    check_out = forms.DateTimeField(input_formats=['%Y-%m-%dT%H:%M'], required=True)


class PhoneNoForm(forms.Form):

    phone_no = forms.IntegerField(required=True)

views.py

class RoomDetailView(View):

    def get(self, request, *args, **kwargs):
        category = self.kwargs.get('category', None)

        got_category = get_room_category(category)

        print(category)
        print(got_category)
    
        form = AvailabilityForm()

        if got_category is not None:
        
            context = {
                'category':got_category,
                'form':form
            }

            return render(request, 'detail.html', context)
        else:
            return HttpResponse("Category Nyet!")

    def post(self, request, *args, **kwargs):
        category = self.kwargs.get('category', None)
        form = AvailabilityForm(request.POST)

        if form.is_valid():
            data = form.cleaned_data
    
            available_rooms = get_available_rooms(category, data['check_in'], data['check_out'] )

            if available_rooms is not None:

                room = available_rooms[0]

                context = {
                    'room':room
                }
        
                return render(request, 'booking/checkout.html', context)
            else:
                return HttpResponse("We're out of those rooms" )
        else:
            return HttpResponse('Form invlid')

class CheckoutView(TemplateView):
    template_name = 'booking/checkout.html'

    def get_phone(request):
        if request.POST:
            phone_no = request.POST.get('PhoneNo', None)
            print(phone_no)

            cl = MpesaClient()
            # Use a Safaricom phone number that you have access to, for you to be able to view the prompt
            phone_number = phone_no
            amount = 1
            account_reference = 'reference'
            transaction_desc = 'Description' 
            callback_url = 'https://darajambili.herokuapp.com/express-payment'

          # callback_url = request.build_absolute_uri(reverse('booking:mpesa_stk_push_callback'))
            response = cl.stk_push(phone_number, amount, account_reference, transaction_desc, callback_url)

            return HttpResponse(response.text)
        
        else:
            return HttpResponse('This is else')
            

checkout.html

    <div>
      <form action="" method="POST">
        {% csrf_token %}
        <label for="Input No.">Input Phone No. :</label>
        <input type="number" name="id_PhoneNo" id="PhoneNo">
        <input type="submit" value="Proceed">
      </form>
    </div>

detail.html

<form id="booking-form" action="" method="POST">

  {% csrf_token %}

    <div class="input-div">
      <label for="id_check_in">Check In : </label>
      <input type="datetime-local" id="id_check_in" name="check_in">
    </div>

    <div class="input-div">
      <label for="id_check_out">Check Out : </label>
      <input type="datetime-local" id="id_check_out" name="check_out">
    </div>

    <div class="input-div">
      <button type="submit">Book the Room</button>
    </div>

  </form>

form.is_valid returns 错误。我曾尝试使用 GET 方法,但我需要 phone 号码进行更多处理,因此我坚持使用 POST。如果可能的话,帮我禁食。问题出在哪里?抱歉,如果代码太多。

您需要 return 将错误发送到 HTML 页面,以了解错误发生的原因。因此,如果表单无效,请通过以下方式将其发送到 HTML 页面:

def post(self, request, *args, **kwargs):
    category = self.kwargs.get('category', None)
    form = AvailabilityForm(request.POST)

    if form.is_valid():
        ...
    else:
        category = self.kwargs.get('category', None)
        got_category = get_room_category(category)

        context = {
            'category':got_category,
            'form':form
        }

        return render(request, 'detail.html', context)

并像这样呈现错误(根据 documentation):

{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
        {% if field.help_text %}
        <p class="help">{{ field.help_text|safe }}</p>
        {% endif %}
    </div>
{% endfor %}

仅供参考,而不是直接继承 View,您应该使用 FormView。以下是有关如何使用的示例代码:

class RoomDetailView(FormView):
    form_class = AvailabilityForm

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        category = self.kwargs.get('category', None)
        got_category = get_room_category(category)
        if got_category is not None:
            context.update({
                'category':got_category,
            })
            return context
        else:
            raise Http404("Category does not exist")

     def form_valid(self, form):
        data = form.cleaned_data
        available_rooms = get_available_rooms(category, data['check_in'], data['check_out'] )
        if available_rooms is not None:  # this part should be in a separate view
           room = available_rooms[0]
           context = {
               'room':room
           }
           return render(request, 'booking/checkout.html', context)
        else:
           return HttpResponse("We're out of those rooms" )