python - 如果表单有其他字段,如何验证 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 语句。
解决方案
您可以通过以这种方式编写方法来验证表单中的任何字段:def clean_(field_name)
即def clean_room(self)
阅读更多:
https ://docs.djangoproject.com/en/3.1/ref/forms/validation/#cleaning-a-specific-field-attribute
推荐阅读
- xcode - Xcode 分析器:sigprocmask 和 __sigaltstack 开销
- javascript - Kubernetes 集群下 POD 上的无效标记压缩接近堆限制分配失败和 v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath
- javascript - 如何使用 MySQL 语法创建 knex 请求?
- javascript - Ajax 删除请求返回 200 但触发错误
- javascript - 有效地在 html 画布上渲染数百万个元素(并从服务器重新创建渲染)
- python - 如何从多索引中提取总年份行和列以在绘图中创建直方图
- c# - 如何在 Azure Functions 中使用 .ENV 文件或用户机密读取配置值
- vb.net - 如何在 listview VB .NET 中检查子项中的字符串长度
- python - 如何使用安装好的 python38 创建一个虚拟环境
- python - 绘制以多个 CSV 文件作为输入的对数比例图