class ProjectForm(models.ModelForm): income = fields.DecimalField(required=False,widget=TextInput(attrs={'readonly':'true'})) expand = fields.DecimalField(required=False,widget=TextInput(attrs={'readonly':'true'})) class Meta: model = Project fields = '__all__'
def __init__(self, max_value=None, min_value=None, decimal_places=None, *args, **kwargs): errors = self.default_error_messages.copy() if 'error_messages' in kwargs: errors.update(kwargs['error_messages']) localize = kwargs.get('localize', False) fields_ = ( fields.DecimalField(max_value=max_value, min_value=min_value, decimal_places=decimal_places, error_messages={'invalid': errors['invalid']}, localize=localize), fields.DecimalField(max_value=max_value, min_value=min_value, decimal_places=decimal_places, error_messages={'invalid': errors['invalid']}, localize=localize), ) super(NumberRangeField, self).__init__(fields_, *args, **kwargs)
class JobForm(ModelForm): geoposition_0 = fields.DecimalField() geoposition_1 = fields.DecimalField() class Meta: model = Job fields = ['title', 'start_asap',]
class SimulatorForm(Form): idade_atual = fields.IntegerField(min_value=0) idade_saida = fields.IntegerField(min_value=50) rentabilidade_anual = fields.DecimalField(min_value=0, decimal_places=2) contribuicao_mensal = fields.DecimalField(min_value=0, decimal_places=2) # rentabilidade_anual = fields.IntegerField(min_value=0) # contribuicao_mensal = fields.IntegerField(min_value=0) sexo = fields.ChoiceField(choices=(('M', 'M'), ('F', 'F')))
def __init__(self, *args, **kwargs): field_list = ( fields.DecimalField(max_value=90, min_value=-90, decimal_places=18, max_digits=25), fields.DecimalField(max_value=180, min_value=-180, decimal_places=18, max_digits=25), fields.IntegerField(), ) if 'query_field_id' in kwargs: kwargs['widget'] = GoogleMapWidget(query_field_id=kwargs.pop('query_field_id')) super(GoogleMapField, self).__init__(field_list, *args, **kwargs)
class CashInvoicePaymentForm(Form): receipt_number = fields.IntegerField() amount = fields.DecimalField(max_digits=8, decimal_places=2, validators=[validators.MinValueValidator(0)]) def __init__(self, *args, instance, **kwargs): super().__init__(*args, **kwargs) self.instance = instance self.helper = FormHelper() self.helper.include_media = False layout = self.helper.build_default_layout(self) layout.fields.append( ButtonHolder( Submit('pay', 'Record Payment'), HTML( '<a href="{}" class="btn btn-secondary">Cancel</a>'.format( reverse( 'front_desk.check_in', kwargs={ 'username': self.instance.recipient.username }, ))))) self.helper.add_layout(layout) def clean_amount(self): amount = self.cleaned_data['amount'] expected_amount = self.instance.total if amount != expected_amount: raise ValidationError( 'The invoice was for USD {}'.format(expected_amount)) return amount
class PubForm(forms.Form): no = fields.CharField(required=True, label="课程号", validators=[RegexValidator(r'\d{8}', "请输入数字")], error_messages={ 'required': '该字段必须要输入', 'invalid': '课程号为8位数字' }) name = fields.CharField(max_length=30, min_length=2, required=True, label="课程名", error_messages={ 'max_length': '最大不能超过30个字', 'min_length': '最小不能少于2个字', 'invalid': '不符合格式要求' }) credit = fields.DecimalField(max_digits=2, decimal_places=1, max_value=5.0, error_messages={ 'invalid': '必须为一位小数', 'max_value': '最大学分不应该超过5.0' }, label="学分") college_id = fields.IntegerField(widget=widgets.Select(), label="授课学院") def __init__(self, *args, **kwargs): super(PubForm, self).__init__(*args, **kwargs) self.fields['college_id'].widget.choices = College.objects.values_list( "id", "name")
class LayerPropertiesForm(Form): visible = fields.NullBooleanField(required=False) use_extent = fields.NullBooleanField(required=False) clickable = fields.NullBooleanField(required=False) transparent = fields.NullBooleanField(required=False) opacity = fields.DecimalField(max_digits=4, decimal_places=1, required=False) allow_download = fields.NullBooleanField(required=False)
class HeavyProductForm(ProductForm): weight = fields.DecimalField(max_digits=6, decimal_places=1) description = fields.Field(widget=widgets.HiddenInput, initial='XY') class Meta: model = Product entangled_fields = {'properties': ['weight']} field_order = ['name', 'tenant', 'active', 'weight']
class PubForm(forms.ModelForm): course_no = fields.CharField( required=True, label="课程号", validators=[RegexValidator(regex='^[0-9]{10}$', message="请输入数字")], error_messages={ 'required': '该字段必须要输入', 'invalid': '课程号为8位数字' }) course_name = fields.CharField(max_length=30, min_length=2, required=True, label="课程名", error_messages={ 'max_length': '最大不能超过30个字', 'min_length': '最小不能少于2个字', 'invalid': '不符合格式要求' }) course_credit = fields.DecimalField(max_digits=2, decimal_places=1, max_value=5.0, error_messages={ 'invalid': '必须为一位小数', 'max_value': '最大学分不应该超过5.0' }, label="学分") course_desc = fields.CharField(widget=widgets.Textarea(), max_length=140, initial="暂无", label="课程描述") class Meta: model = Course fields = [ "course_college", ] # 解决form初始化时数据库数据不刷新问题 def __init__(self, *args, **kwargs): super(PubForm, self).__init__(*args, **kwargs) cour = Course.objects.last() n_date = datetime.datetime.now().strftime("%Y%m%d") if not cour: ini_no = n_date + '01' elif n_date > cour.course_no[:8]: ini_no = n_date + '01' else: ini_no = str(int(cour.course_no) + 1) self.fields['course_no'].initial = ini_no
class ChargesForm(Form): date = fields.DateField(label='date') value = fields.DecimalField(label='value') def clean(self): cleaned_data = super(ChargesForm, self).clean() date_charge = cleaned_data.get('date') value_charge = cleaned_data.get('value') today = date.today() if value_charge < 0: if date_charge > today: self.add_error('date', "Impossible to make a write-off") self.add_error('value', "Impossible to make a write-off") return cleaned_data
class DetailedForm(forms.Form): """ required:是否必填 error_messages:錯誤提示(要透過{{ obj.errors.user.0 }}調用) widget:訂製html插件(重要) label:訂製標籤名(要透過{{ obj.user.label }}調用) initial:默認值 validators:自訂製驗證規則 disabled:是否禁止編輯 """ user = fields.CharField( required=True, max_length=12, # 最大長度 min_length=3, # 最小長度 error_messages={}, widget=widgets.TextInput(attrs={'n': 123}), # 參數為自定義屬性 label="用戶名", initial='請輸入用戶名', disabled=True, ) age = fields.IntegerField( label="年齡", max_value=1000, # 最大值 min_value=0, # 最小值 error_messages={ 'max_value': '太大了', }) email = fields.EmailField(label="信箱", ) smath = fields.DecimalField() # 小數 file = fields.FileField() city = fields.ChoiceField( choices=[(1, "上海"), (2, "北京"), (3, "南京")], # (value, 顯示文字) initial=3, # 默認value=3 ) hobby = fields.MultipleChoiceField( choices=[(1, "籃球"), (2, "電動"), (3, "小說")], # (value, 顯示文字) initial=[1, 2], ) # date = fields.DateField() # 格式:2015-09-01 # datetime = fields.DateTimeField() # 格式:2015-09-01 11:12 radio = fields.ChoiceField( choices=[(1, 'man'), (2, 'woman')], widget=widgets.RadioSelect(), ) check = fields.MultipleChoiceField( choices=[(1, 'man'), (2, 'woman')], widget=widgets.CheckboxSelectMultiple(), ) from django.core.validators import RegexValidator my = fields.CharField( # 自定義正則一 # validators可設置多個RegexValidator # RegexValidator(正則, 錯誤信息) validators=[ RegexValidator(r"^[0-9]+$", "請輸入數字"), RegexValidator(r"^87[0-9]+$", "請以87開頭") ], ) # 自定義正則二 # fields.RegexField(正則),只可設置單個正則 my2 = fields.RegexField(r"^[0-9]+$", error_messages={ "invalid": "請輸入數字", })
def __get_dynamicprocessform(self, process_id): d = DynamicFieldProcess.objects.filter( process=process_id).order_by('sequence') if d.count() == 0: return False dynfields = {} for f in d: max_length = [250, f.max_length][f.max_length > 0] required = [False, True][f.required] initial = None if f.fieldtype == 'CharField': formfield = fields.CharField(max_length=max_length, required=required, label=f.label, initial=initial) if f.fieldtype == 'TextField': formfield = TextField(required=required, label=f.label, initial=initial) if f.fieldtype == 'EmailField': formfield = fields.EmailField(max_length=max_length, required=required, label=f.label, initial=initial) if f.fieldtype == 'DateField': formfield = fields.DateField( ('%d/%m/%Y', ), widget=DateTimeInput(format='%d/%m/%Y', attrs={ 'class': 'brdatefield', 'maxlength': '10' }), required=required, label=f.label, initial=initial) if f.fieldtype == 'IntegerField': formfield = fields.IntegerField(required=required, label=f.label, min_value=0, initial=initial) if f.fieldtype == 'DecimalField': formfield = fields.DecimalField(max_digits=10, decimal_places=2, required=required, label=f.label, initial=initial) if f.fieldtype == 'BooleanField': formfield = fields.BooleanField(required=False, label=f.label, initial='true') if f.fieldtype == 'FileField': formfield = fields.FileField(required=required, label=f.label, initial=initial) dynfields[f.name] = formfield form = type('', (forms.Form, ), dynfields) def as_ext(self): return mark_safe(simplejson.dumps(self, cls=ExtJSONEncoder)) form.as_ext = as_ext return form
def __get_dynamicworkform(self, step_id, work_id=None): d = DynamicFieldStep.objects.filter(step=step_id).order_by('sequence') if d.count() == 0: return False dynfields = {} for f in d: max_length = [250, f.max_length][f.max_length > 0] required = [False, True][f.required] # Try get value, if the field already exist. For exampĺe, a reject work try: initial = u'' % WorkFieldValue.objects.get(dynamicfield=f, work=work_id).value except: initial = None if f.fieldtype == 'CharField': formfield = fields.CharField(max_length=max_length, required=required, label=f.label, initial=initial) if f.fieldtype == 'TextField': formfield = TextField(required=required, label=f.label, initial=initial) if f.fieldtype == 'EmailField': formfield = fields.EmailField(max_length=max_length, required=required, label=f.label, initial=initial) if f.fieldtype == 'DateField': formfield = fields.DateField( ('%d/%m/%Y', ), widget=DateTimeInput(format='%d/%m/%Y', attrs={ 'class': 'brdatefield', 'maxlength': '10' }), required=required, label=f.label, initial=initial) if f.fieldtype == 'IntegerField': formfield = fields.IntegerField(required=required, label=f.label, min_value=0, initial=initial) if f.fieldtype == 'DecimalField': formfield = fields.DecimalField(max_digits=10, decimal_places=2, required=required, label=f.label, initial=initial) if f.fieldtype == 'BooleanField': formfield = fields.BooleanField(required=False, label=f.label, initial='true') if f.fieldtype == 'FileField': formfield = fields.FileField(required=required, label=f.label, initial=initial) dynfields[f.name] = formfield process = f.step.process sequence = f.step.sequence next_steps = Step.objects.filter( process=process, sequence__gt=sequence).order_by('sequence') if next_steps.count() > 0: for n in next_steps: if n.sequence == sequence + 1: selected = n.pk if not selected: selected = n.pk dynfields['step'] = ModelChoiceField(queryset=next_steps, label=u'Próximo Passo', empty_label=None, initial=selected) form = type('', (forms.Form, ), dynfields) def as_ext(self): return mark_safe(simplejson.dumps(self, cls=ExtJSONEncoder)) form.as_ext = as_ext return form
class form_glasses_final_inspection_technique_create(forms.Form): lab_number = forms.CharField(label='Lab Order Number', required=False, widget=forms.HiddenInput()) pd = fields.DecimalField(label='双眼 PD', required=False, initial=0, widget=forms.NumberInput()) is_singgle_pd = fields.BooleanField(label='单PD', required=False, initial=False, widget=forms.NullBooleanSelect()) od_pd = fields.DecimalField(label='右眼 PD', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) os_pd = fields.DecimalField(label='左眼 PD', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) od_asmbl_seght = fields.DecimalField(label='加工瞳高 OD', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) os_asmbl_seght = fields.DecimalField(label='加工瞳高 OS', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) od_prism = fields.DecimalField(label='右眼 Prism', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) od_base = fields.DecimalField(label='右眼 Base', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) os_prism = fields.DecimalField(label='左眼 Prism', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) os_base = fields.DecimalField(label='左眼 Base', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) od_prism1 = fields.DecimalField(label='右眼2 Prism', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) od_base1 = fields.DecimalField(label='右眼2 Base', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) os_prism1 = fields.DecimalField(label='左眼2 Prism', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) os_base1 = fields.DecimalField(label='左眼2 Base', required=False, initial=0, max_digits=5, decimal_places=2, widget=forms.NumberInput()) blue_blocker = fields.BooleanField(required=False, initial=False, label='镜片抗蓝光', widget=forms.NullBooleanSelect()) polarized = fields.BooleanField(required=False, initial=False, label='镜片偏光', widget=forms.NullBooleanSelect()) light_responsive = fields.BooleanField(required=False, initial=False, label='镜片膜变', widget=forms.NullBooleanSelect()) light_responsive_color = fields.ChoiceField( required=False, initial=False, label='变色颜色', choices=choices_models.LENS_COLOR_CHOICES, widget=forms.Select()) co = fields.BooleanField(required=False, initial=False, label='超防水涂层', widget=forms.NullBooleanSelect()) tint = fields.BooleanField(required=False, initial=False, label='染色', widget=forms.NullBooleanSelect()) tint_deepness = fields.DecimalField(label='染色深度', required=False, initial=0, max_digits=4, decimal_places=0, widget=forms.NumberInput()) is_gradient = fields.BooleanField(required=False, initial=False, label='渐变染色', widget=forms.NullBooleanSelect()) is_d_thin = fields.BooleanField(required=False, initial=False, label='是否美薄', widget=forms.NullBooleanSelect()) is_qualified = fields.BooleanField(label='是否合格', required=False, initial=False, widget=forms.NullBooleanSelect()) comments = forms.CharField( label='备注', required=False, max_length=4096, widget=forms.Textarea(attrs={'class': 'form-control'})) assembler_id = fields.IntegerField(label='assembler_id', required=False, widget=forms.Select()) # add lee 2020.8.4 cutting_edge_user_id = fields.IntegerField(label='割边师', required=False, widget=forms.Select()) beauty_user_id = fields.IntegerField(label='整型师', required=False, widget=forms.Select()) # end od_sub_mirrors_height = fields.DecimalField(label='右眼子镜高', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) os_sub_mirrors_height = fields.DecimalField(label='左眼子镜高', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) is_special_handling = fields.BooleanField(label='加工要求是否合格', required=False, initial=False, widget=forms.NullBooleanSelect()) od_tint_deepness = fields.DecimalField(label='右片染色深度', required=False, initial=0, max_digits=4, decimal_places=0, widget=forms.NumberInput()) os_tint_deepness = fields.DecimalField(label='左片染色深度', required=False, initial=0, max_digits=4, decimal_places=0, widget=forms.NumberInput()) clipon_qty = fields.DecimalField(label='夹片', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) is_polishing = fields.BooleanField(label='是否抛光', required=False, initial=False, widget=forms.NullBooleanSelect()) is_near_light = fields.BooleanField(label='近光区是否完整', required=False, initial=False, widget=forms.NullBooleanSelect()) coatings = fields.CharField(label='膜层') npd = fields.DecimalField(label='双眼 NPD', required=False, initial=0, widget=forms.NumberInput()) od_npd = fields.DecimalField(label='右眼 NPD', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput()) os_npd = fields.DecimalField(label='左眼 NPD', required=False, initial=0, max_digits=5, decimal_places=1, widget=forms.NumberInput())
class ChargeForm(Form): amount = fields.DecimalField(label='Сумма:', required=True, max_digits=7, decimal_places=2, widget=widgets.TextInput( attrs={ 'class': 'form___input', 'Placeholder': '12345.00', 'Pattern': '^[+-]?\d{0,5}(.\d{2})?$' })) # amount = fields.CharField( # label='Сумма:', # required=True, max_length=9, # widget=widgets.Input( # attrs={'class': 'form___input', # 'Placeholder': '12345.00', # 'Pattern': '^[+-]?\d{0,5}(.\d{2})?$' # } # ) # ) date = fields.DateField( label='Дата:', required=True, widget=widgets.DateInput(attrs={ 'class': 'form___input', 'type': 'date', 'placeholder': 'гггг-мм-дд' })) def clean(self): cleaned_data = super().clean() value_date_cln = self.cleaned_data.get('date') value_amount_cln = self.cleaned_data.get('amount') value_amount = self.data['amount'] value_date = self.data['date'] def check(field, name): """Попытка реализовать проверку для Safari""" if field == '': err = 'Введите значение в поле "{}"'.format(name) return self.add_error(None, err) if name == 'Сумма': p = re.compile(r'^[+-]?(\d*)(?:\.(\d*))?$') result = p.match(field) if result is None: err = 'Формат поля "{}": 12345.67 '.format(name) return self.add_error(None, err) else: if result.groups()[0] is not None and len( result.groups()[0]) > 5: err = 'Максимальная сумма - 99999.99' self.add_error(None, err) if result.groups()[1] is not None and len( result.groups()[1]) > 2: err = 'После точки должно быть не более двух цифровых знаков' self.add_error(None, err) return if name == 'Дата': pattern = re.compile(r'^(\d{4})\-(\d{2})\-(\d{2})$') results = pattern.match(field) print(results) if results is None: err = 'Формат поля "{}": 2012-12-24 '.format(name) return self.add_error(None, err) else: try: date(int(results.groups()[0]), int(results.groups()[1]), int(results.groups()[2])) except: err = 'Неправильно введена дата!' return self.add_error(None, err) check(value_amount, 'Сумма') check(value_date, 'Дата') if value_date_cln is not None and value_amount_cln is not None and \ value_amount_cln < 0 and value_date_cln > date.today(): self.add_error(None, 'Нельзя проводить списание в будущем!') return cleaned_data