验证Django中的自动完成字段

时间:2010-05-11 02:38:05

标签: django validation django-forms

我的模型类似于以下内容:

class Band(models.Model):
    name = models.CharField(unique=True)

class Event(models.Model):    
    name = models.CharField(max_length=50, unique=True)       
    bands = models.ManyToManyField(Band) 

基本上我想使用已经为Event存在的ModelForm提供的验证功能,但我想要显示默认的多选列表(对于'band')页面,因为相关模型的潜在长度非常长。

我定义了以下表格:

class AddEventForm(ModelForm):
    class Meta: 
        model = Event
        fields = ('name', )

对模型的期望是什么,但当然,验证可能不关心'波段'字段。我已经有足够的工作来正确添加波段,但没有正确的验证,它只会丢弃坏带ID。

我应该怎样做以确保至少有一个(正确的)乐队ID与我的表单一起发送?

有关我如何使用自动完成功能发送带号,请参阅此相关问题:Django ModelForm Validate custom Autocomplete for M2M, instead of ugly Multi-Select

1 个答案:

答案 0 :(得分:1)

您可以覆盖ModelForm中的默认字段。

class AddEventForm(forms.ModelForm):
     band = forms.CharField(max_length=50)

     def clean_band(self):
         bands = Band.objects.filter(name=band,
             self.data.get('band', ''))
         if not bands:
             raise forms.ValidationError('Please specify a valid band name')
         self.cleaned_data['band_id'] = bands[0].id

然后您可以使用自动完成小部件或其他小部件。您还可以使用自定义窗口小部件,只需将其传递到波段字段定义:band = forms.CharField(widget=...)