首页 > 解决方案 > 如果表单有其他字段,如何验证 django modelform

问题描述

我已经制作了一个 Django 模型表单,但问题在于我的逻辑我正在使用其他东西,现在我想通过定义一个 Meta 类并选择我想向用户显示的字段来找出一种验证它的方法,但是当然这不会验证表格。现在我想知道是否有一种方法可以在不接触模型的情况下验证表单并传递逻辑所需的数据,然后处理要保存的模型数据所需的信息。

这是模型:

from django.db import models

from django.db import models
from django.contrib.auth.models import User


# Create your models here.
class RoomCategory(models.Model):
    name      = models.CharField(max_length=59)
    price     = models.IntegerField()
    beds      = models.PositiveIntegerField()
    capacity  = models.PositiveIntegerField()
    size      = models.CharField(max_length=59)

    def __str__(self):
        return self.name

class Room(models.Model):
    room_number = models.CharField(max_length=60)
    room_category = models.ForeignKey(RoomCategory, on_delete=models.CASCADE)

    def __str__(self):
        return f"The room {self.room_number} {self.room_category} has a maximum of {self.room_category.capacity} person and cost {self.room_category.price}/night "
    

class Booking(models.Model):   
    customer    = models.ForeignKey(User, on_delete=models.CASCADE)
    room        = models.ForeignKey(RoomCategory, on_delete=models.CASCADE)
    check_in    = models.DateField()
    check_out   = models.DateField()
    adults      = models.PositiveSmallIntegerField()
    children    = models.PositiveSmallIntegerField()

    def __str__(self):
        return f"{self.customer} has booked for {self.room} from {self.check_in} to {self.check_out}"

这是表格:

class BookingForm(forms.ModelForm):

   class Meta:
       model = Booking
       fields = ['room', 'check_in', 'check_out', 'adults', 'children']

这是views.py

 data       = form.cleaned_data
        roomlist         = Room.objects.filter(room_category__name=data['room'])
        available_rooms  = []
        for room in roomlist:
            if data['adults'] + data['children'] > room.room_category.capacity:
                return HttpResponse(f'Sorry !! But this category of room cannot handle more than {room.room_category.capacity}')
            else:
            
                if check_availability(room.room_category.name, data['check_in'], data['check_out'], data['adults'], data['children']):
                
                    available_rooms.append(room)
            

        if len(available_rooms) > 0:
            room = available_rooms[0]
            new_booking = Booking.objects.create(
                customer=self.request.user,
                room=room,
                check_in=data['check_in'],
                check_out=data['check_out'],
                adults=data['adults'],
                children=data['children']
            )
            new_booking.save()
            
            return HttpResponse(new_booking)
        else:
            return HttpResponse('All the rooms of this type are not available')

它没有打印数据意味着表单无效,它属于 else 语句。

标签: pythondjangodjango-models

解决方案


您可以通过以这种方式编写方法来验证表单中的任何字段:def clean_(field_name)def clean_room(self)阅读更多: https ://docs.djangoproject.com/en/3.1/ref/forms/validation/#cleaning-a-specific-field-attribute


推荐阅读