Django:对于具有空QueryDict作为初始数据的多对多字段,验证失败

时间:2016-01-26 20:16:11

标签: python django

设定:

  • 使用Django 1.9的Python 3.5.1。
  • 我在模型CreateRentView上运行了基于类的通用视图Rent。我实施了自定义ModelForm RentForm来实施其他验证(例如,确保start_time <= end_time)。
  • 创建新的Rent(通过CreateRentView)时,第一个用户定义开始和结束时间。这会触发AJAX请求以获取此时间范围内的可用对象,并使用Javascript填充rental_objects HTML小部件(请参见下面的屏幕截图)。

问题:

  • 一切正常(自定义验证和AJAX通信),但在提交表单时,我收到(多对多)字段rental_objects的验证错误:Select a valid choice. 1 is not one of the available choices.
  • 注意:在下面的屏幕截图中,在提交表单之前选择了租借对象MB1

这是因为我想将字段rental_objects初始化为空。因此,类get_form()的方法CreateRentView将表单字段rental_objects设置为空QuerySet

def get_form(self):
    form = super(generic.CreateView, self).get_form()
    # Rental objects are retrieved via AJAX after start and end time is defined.
    form.fields["rental_objects"].queryset = RentalObject.objects.none()

显然,这会触发内部Django验证,确保将此字段提交为空。

如何避免此验证?

PS:当然,我无法覆盖get_form()并使用Javascript清空rental_objects的HTML小部件。但是,这只是一个混乱的解决方法

Django-AJAX-ManyToManyField http://i67.tinypic.com/14uv0gl.jpg

1 个答案:

答案 0 :(得分:0)

我相信这是出租物品的选择。

如果您使用整数作为选择,则应使用IntegerField。对于CharField使用字符串