【问题标题】:Validating an Autocomplete field in Django验证 Django 中的自动完成字段
【发布时间】:2010-05-11 02:38:04
【问题描述】:

我有类似以下的模型:

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) 

本质上我想使用已经存在的 ModelForm 为 Event 提供的验证功能,但我不想想在页面,因为相关模型的潜在长度非常长。

我定义了以下形式:

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

这符合模型的预期,但当然,验证可能不太关心“bands”字段。我已经让它工作得足以正确添加频段,但没有正确的验证,它只会删除坏的频段 ID。

我应该怎么做才能确保我的表格中至少有一个(正确的)乐队 ID?

关于我如何发送带有自动完成功能的波段 ID,请参阅以下相关问题:Django ModelForm Validate custom Autocomplete for M2M, instead of ugly Multi-Select

【问题讨论】:

    标签: django validation django-forms


    【解决方案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=...)

    【讨论】:

    • 看来我需要创建一个新的自定义小部件,专门为此目的......鉴于此,为此目的,我在技术上无论如何都试图覆盖小部件。有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2015-08-14
    • 2016-12-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多