Проверка поля автозаполнения в Django - PullRequest
1 голос
/ 11 мая 2010

У меня есть модели, подобные следующим:

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, но я не хочу показать список Multi-Select по умолчанию (для 'band') на странице , потому что потенциальная длина связанных моделей чрезвычайно велика.

У меня определена следующая форма:

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

Что делает то, что ожидается для Модели, но, конечно, валидация может меньше заботиться о поле 'band'. У меня достаточно работы, чтобы правильно добавлять группы, но правильной проверки нет, и он просто сбрасывает неверные идентификаторы.

Что я должен сделать, чтобы убедиться, что по крайней мере один (правильный) идентификатор группы был отправлен вместе с моей формой?

Сведения о том, как я отправляю идентификаторы диапазонов с автозаполнением, см. В следующем смежном вопросе: Django ModelForm Проверка пользовательского автозаполнения для M2M вместо уродливого Multi-Select

1 Ответ

1 голос
/ 11 мая 2010

Вы можете переопределить поля по умолчанию в 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: band = forms.CharField(widget=...)

...