Контекстная проверка формы в Django

Я хочу выполнить «контекстную» проверку формы в django. Рассмотрим этот случай:

PLACE_TYPES = (
    ('RESTAURANT', 'Restaurant'),
    ('BARCLUB', 'Bar / Club'),
    ('SHOPPING', 'Shopping'),
)

RESTAURANT_FORMAT_CHOICES = (
    ('FAST_FOOD', 'Fast Food'),
    ('FAST_CASUAL', 'Fast Casual'),
    ('CASUAL', 'Casual'),
    ('CHEF_DRIVEN', 'Chef Driven'),
)

class Place(models.Model):
    place_type          = models.CharField(max_length=48, choices=PLACE_TYPES, blank=False, null=False)
    name                = models.CharField(max_length=256)
    website_1           = models.URLField(max_length=512, blank=True)
    hours               = models.CharField(max_length=1024, blank=True)

    geometry            = models.PointField(srid=4326, blank=True, null=True)

    #Restaurant Specific
    restaurant_format    = models.CharField(max_length=128, choices=RESTAURANT_FORMAT_CHOICES, blank=True, null=True)

Таким образом, в админке django соответствующая форма для места будет иметь выпадающее меню с такими вариантами, как «ресторан, бар, клуб», и есть еще одно поле под названием «restaurant_format».

Проверка должна гарантировать, что restaurant_field не может быть нулевым, если первое раскрывающееся меню было установлено как «ресторан».

Я пытаюсь что-то вроде этого:

class PlaceAdminForm(forms.ModelForm):
    def clean(self):
        if self.cleaned_data['place_type'] == 'RESTAURANT':  
            if self.cleaned_data['place_type'] is None:
                    raise forms.ValidationError('For a restaurant you must choose a restaurant format')

но получить эту ошибку:

Тип исключения: KeyError Значение исключения:
place_type

Расположение исключения: /place/admin.py в чистой строке 27.


person sghael    schedule 13.06.2009    source источник


Ответы (1)


я думаю, что у меня это работает с этой чистой рутиной:

def clean(self):
    cleaned_data = self.cleaned_data
    place_type = cleaned_data.get("place_type")
    restaurant_format = cleaned_data.get("restaurant_format")

    if place_type == 'RESTAURANT':
        if self.cleaned_data['restaurant_format'] is None:
            raise forms.ValidationError('For a restaurant you must choose a restaurant format')

    # Always return the full collection of cleaned data.
    return cleaned_data
person sghael    schedule 13.06.2009