【问题标题】:why is django returning form.is_valid == false?为什么 django 返回 form.is_valid == false?
【发布时间】:2020-11-08 20:47:57
【问题描述】:

每次使用此表单时,我都会得到 form.is_valid() == False 。当我做 print(form.errors) 我得到:

<ul class="errorlist"><li>reservation_code<ul class="errorlist"><li>Client with this Reservation code already exists.</li></ul></li></ul>

但表单的重点是通过输入现有的预订代码来获取预订的详细信息。那么如何更改此设置以使表单返回有效?

这里是视图:

def reservationView(request):

    if request.method == "GET":
        return render(request,'aplikacija/reservations.html')
    else:
        form = ReservationForm(request.POST)
        if form.is_valid():
            code = form.cleaned_data['reservation_code']
      
            try:
                client = Client.objects.filter(reservation_code=code)
                tour = client.tour.destination
                client.delete()
                return render(request,'aplikacija/reservations.html',{'infoMsg':f'You have successfully cancelled your trip to {tour}'})
            except:
                form = ReservationForm()
                return render(request,'aplikacija/cancelReservation.html',{'form':form,'infoMsg':'INVALID RESERVATION CODE'})
            
        else:
            form = ReservationForm()
            print(form.errors)
            return render(request,'aplikacija/cancelReservation.html',{'form':form,'infoMsg':'FORM INVALID'})

这是模型:

class Client(models.Model):

    name = models.CharField(max_length=256)
    surname = models.CharField(max_length=256)
    email = models.CharField(max_length=256)
    number_of_guests =models.IntegerField()
    tour = models.ForeignKey(Tour,on_delete=models.CASCADE)
    total_price = models.DecimalField(decimal_places=2,max_digits=15,default=0)
    reservation_code = models.CharField(max_length=50,unique=True)

这是表单类:

class ReservationForm(forms.ModelForm):

    class Meta:

        model = Client
        fields = ('reservation_code',)
        widgets = {
            'reservation_code':forms.TextInput(attrs={'class':'clientFormField'})
        }

这是模板:

{% extends 'aplikacija/base.html' %}

{% block content %}
<h2 id="mostPopularTitle">Please enter your reservation code</h2>

    <form method="POST" action="{% url 'reservation_details' %}" class="contactFormTab clientForm">
        {{infoMsg}}
        
    
        {% csrf_token %}
        {{ form.as_p }}
    
        <button type="submit" class="btn">Get reservation details</button>
    </form>


{% endblock %}

有人知道为什么表单总是返回无效吗?

【问题讨论】:

  • 您好,如果已经存在一个您正在保存的带有“reservation_code”的客户端,您是否签入了您的数据库?不要忘记您定义了 unique=True,这会创建约束唯一字段。
  • 我没有保存,我只是检查预订代码是否存在,然后根据现有的预订代码获取客户详细信息。所以这不应该是一个冲突,虽然我把它是独一无二的

标签: django forms django-forms


【解决方案1】:

对于你说的这个问题

表格的重点是获取预订的详细信息, 通过输入已有的预订代码

你做错了。如果您想根据 reservation_code 获取详细信息,则需要更改一些逻辑。

创建ModelForm 没有任何意义,但如果需要,您可以简单地使用Form

您可以将表单方法从POST 更改为GET

 <form  action="{% url 'reservation_details' %}" class="contactFormTab clientForm">
        {{infoMsg}}
        <input type='text' name='reservation_code' placeholder='Reservation Code'>
        <button type="submit" class="btn">Get reservation details</button>
    </form>

现在在视图中。

def reservation_view(request):
   reservation_code = request.GET.get('reservation_code')
   client = Clinet.objects.get(reservation_code=reservation_code)
   return render(request, 'your_template', {'client':client}

现在在模板中,您可以使用此预订代码获取客户详细信息

{{clinet.name}} {{client.surname}}

【讨论】:

  • 我像你说的那样使用常规形式..绝对是更好的选择。只有这一次我总是得到 'INVALID RESERVATION CODE' 。我直接从数据库中复制代码,但它仍然表现得好像具有该代码的客户端不存在..
  • 您正在使用ModelForm。如果您不将对象保存在数据库中,为什么要使用 modelform
猜你喜欢
  • 2020-04-06
  • 2014-01-10
  • 2020-05-09
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多