2017-07-26 4 views
2

私はDjangoモデルとフォームにDecimalFieldを持っています。同様に、html形式の入力があります。コンマはthounsand separatorと小数点の区切り記号(123,456.78)、jqueryプラグインCleave.jsしかし、私は、このショーの私のフォームを保存しようとするメッセージが言う:番号を入力してください。整形された入力からdjangoモデルに十進数値を渡す

フォームのデータを10進数で保存し、html形式を失うことなく保存します。

大変申し訳ございません。私の英語はあまりにも悪いです。ここで

が私のコードです:

モデル

class Product(models.Model): 
    Price = models.DecimalField(
     max_digits=17, 
     decimal_places=2, 
     default=0.00, 
     validators=[ 
      MinValueValidator(
       100.00, 
       message='>=100')]) 

フォーム

class ProductForm(forms.ModelForm): 
    price = forms.DecimalField(
     label='Price', 
     label_suffix=False, 
     max_digits=17, 
     decimal_places=2, 
     widget=forms.TextInput(
      attrs={'placeholder': '123,456.78'}) 
     ) 

    class Meta: 
     model = Product 
     fields = [ 
      'price' 
     ]  

ビュー

class NewProduct(CreateView): 
    model = Product 
    form_class = ProductForm 
    template_name = 'new_product.html' 

    def get_success_url(self): 
     return reverse('products:new') 

    def get_queryset(self): 
     products = Product.objects.all() 
     return products 

    def get_context_data(self, **kwargs): 
     context = super(NewProduct, self).get_context_data(**kwargs) 
     context['products'] = self.get_queryset() 
     return context 

Htmlの

<html lang="es"> 
    <head>  
     <script src="{% static 'js/cleave.js' %}" type="text/javascript"></script> 
    </head> 

    <body> 
     <input type="text" id="price" class="price"> 

     <script> 
      new Cleave('.price', { 
       numeral: true, 
       numeralDecimalMark: '.', 
       delimiter: ',' 
      }); 
     </script> 
    </body> 
</html> 

enter image description here

+0

ビューの内側には何ですか? –

+0

私は、ビューを追加 –

答えて

0

まあ、私は、カンマを機能to_pythonオーバーライドおよび交換のために、緩んでいない元の動作のために、DecimalFieldはクラスをサブクラス化し、数千人(DecimalFieldはクラスに基づく)と呼ばれる新しいクラスを作成し、この問題を解決しました空の文字列 ''を使用します。

ここに私のコードです。

誰かがより良い方法を書いてここに公開できたら、私は非常にgratefulyになるでしょう。

もう一度、私の英語はあまりにも悪く、申し訳ありません!

モデル

class Product(models.Model): 
    Price = models.DecimalField(
     max_digits=17, 
     decimal_places=2, 
     default=0.00, 
     validators=[ 
      MinValueValidator(
       100.00, 
       message='>=100')]) 

フォーム

from decimal import Decimal, DecimalException 

class Thousands(forms.DecimalField): 
    def to_python(self, value): 
     if value in self.empty_values: 
      return None 
     if self.localize: 
      value = formats.sanitize_separators(value) 
     value = force_text(value).strip().replace(',', '') 

     try: 
      value = Decimal(value) 
     except DecimalException: 
      raise ValidationError(self.error_messages['invalid'], code='invalid') 
     return value 


class ProductForm(forms.ModelForm): 
    price = Thousands(
     label='Price', 
     label_suffix=False, 
     max_digits=17, 
     decimal_places=2, 
     widget=forms.TextInput(
      attrs={'placeholder': '123,456.78'}) 
     ) 

    class Meta: 
     model = Product 
     fields = [ 
      'price' 
     ]  

ビュー

class NewProduct(CreateView): 
    model = Product 
    form_class = ProductForm 
    template_name = 'new_product.html' 

    def get_success_url(self): 
     return reverse('products:new') 

    def get_queryset(self): 
     products = Product.objects.all() 
     return products 

    def get_context_data(self, **kwargs): 
     context = super(NewProduct, self).get_context_data(**kwargs) 
     context['products'] = self.get_queryset() 
     return context 

Htmlの

<html lang="es"> 
    <head>  
     <script src="{% static 'js/cleave.js' %}" type="text/javascript"></script> 
    </head> 

    <body> 
     <form action="." method="post"> 
      {% csrf_token %} 

      {{ form }} 
     </form> 

     <script> 
      new Cleave('.price', { 
       numeral: true, 
       numeralDecimalMark: '.', 
       delimiter: ',' 
      }); 
     </script> 
    </body> 
</html> 
関連する問題