我的模型类似于以下内容:
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
答案 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=...)