2017-01-17 8 views
1

Я пытаюсь установить атрибут min_value на уровне формы в моей модели.Настройка размера диаграммы Django Значение на FloatField

Forms.py

class ProductForm(forms.models.ModelForm): 
    class Meta: 
     model = Artikel 
     localized_fields = '__all__' 
     fields = ('price',) 

Model.py

class Artikel(models.Model): 
    price = models.FloatField(help_text ='Price') 

Как я настроить ModelForm, что я могу ограничить допустимые значения на ModelForm? Я хочу, чтобы пользователь вводил только значения, равные или равные 0,01. Я не хочу ограничиваться на уровне базы данных, поэтому я не хочу ограничивать себя в этом отношении.

+0

@Saket это не точный дубликат. Этот вопрос касается ModelForm, связанный вопрос касается регулярной формы. Ответ для каждого отличается. –

+0

@ voodoo-burger Спасибо, что указали это. Это была моя ошибка. Я считаю, что это должно быть правильно. http://stackoverflow.com/questions/19489699/how-to-add-class-id-placeholder-attributes-to-a-field-in-django-model-forms – Saket

ответ

2

Вы можете переопределить метод ModelForm init. Это позволит установить атрибут на поле min 10:

def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) 
     self.fields['price'].widget.attrs['min'] = 10 
3

В дополнение к установке атрибута 'мин' на виджете, а также переопределить clean_fieldname форму в() метод:

class ProductForm(forms.models.ModelForm): 

     def __init__(self, *args, **kwargs): 
      super(ProductForm, self).__init__(*args, **kwargs) 
      self.fields['price'].widget.attrs['min'] = 0.01 


     def clean_price(self): 
      price = self.cleaned_data['price'] 
      if price < 0.01: 
       raise forms.ValidationError("Price cannot be less than 0.01") 
      return price 

     class Meta: 
      model = Artikel 
      localized_fields = '__all__' 
      fields = ('price',) 

Doc говорит:

Метод clean_<fieldname>() вызывается на форме подкласса - где заменяется именем атрибута поля формы. Этот метод выполняет любую очистку, специфичную для этого конкретного атрибута, не связанную с типом поля, которым он является. Этот метод не передает никаких параметров. Вам нужно будет искать значение поля в self.cleaned_data и помнить, что в данный момент это будет объект Python, а не исходная строка, представленная в форме (она будет в cleaned_data, потому что общий метод clean() поля , выше, уже очистил данные один раз).

+0

Чистый метод называется отправкой формы сообщения. Исходный вопрос запрашивает подтверждение на стороне клиента. Однако ваш ответ должен сочетаться с переопределением initFormForm, чтобы обеспечить проверку как на стороне клиента, так и на стороне сервера. – Saket

+1

@Saket обновлен в соответствии с вашими предложениями. –

+0

@AatishNeupane, как 'clean_date' собирается очистить поле цены? –

0

Простой способ сделать это, чтобы установить валидатор на поле и предоставить сообщение об ошибке:

class ProductModelForm(forms.ModelForm): 
    price = forms.FloatField(min_value=0.01, 
          errors={'min_value': u'Price cannot be less than 0.01'})