class StoryForm(ModelForm): class Meta: model=NewsStory fields= ['title', 'pub_date', 'content', 'img_url'] pub_date = SplitDateTimeField( # use split date time field to allow the user to input both date and time widget=SplitDateTimeWidget( # we use the split date time widget to specify how the html gets built date_attrs={'type': 'date'}, # type date tells django to use the HTML5 date input time_attrs={'type': 'time'}, # type time tells django to use the HTML5 time input ) )
class OilTradeForm(ModelForm): dateTime = SplitDateTimeField() def clean(self): cd = super(OilTradeForm, self).clean() if 'oil' not in cd: self.errors.pop( 'oil' ) # Removing English error message and then adding Uzbek error message if self.data['oil'] == '': self.add_error('oil', 'Yog\' Nomi bo\'sh bo\'lmasligi kerak') else: self.add_error( 'oil', 'Siz kiritgan "' + self.data['oil'] + '" yog\' topilmadi') return cd if 'litreSold' not in cd: self.errors.pop( 'litreSold' ) # Removing English error message and then adding Uzbek error message if self.data['litreSold'] == '': self.add_error('litreSold', 'Sotilgan Litr bo\'sh bo\'lmasligi kerak') else: self.add_error( 'litreSold', 'Sotilgan litr sonini to\'g\'ri formatda kiriting') return cd else: litre_sold = Decimal(cd['litreSold']) if litre_sold <= 0: self.add_error('litreSold', 'Sotilgan litr 0 dan katta bo\'lishi kerak') return cd oil = Oil.objects.get(name=cd['oil']) if oil.RemainingLitres < litre_sold: self.add_error( 'litreSold', 'Kiritilgan litr qolgan yog\' miqdoridan oshib ketdi') return cd class Meta: model = OilTrade fields = ['oil', 'litreSold', 'dateTime']
class StoryForm(ModelForm): pub_date = SplitDateTimeField( widget = SplitDateTimeWidget( date_attrs={'type': 'date'}, time_attrs={'type': 'time'}, ) ) class Meta: model = NewsStory fields = ['title', 'pub_date', 'content', 'image'] labels = { 'image' : _('Image (URL)'), } widgets = { 'title' : forms.TextInput(attrs={'placeholder': 'Title'}), 'content' : forms.Textarea(attrs={'placeholder': 'Story Content'}), 'image' : forms.URLInput(attrs={'placeholder': 'Image URL'}) }
def test_splitdatetimefield_1(self): f = SplitDateTimeField() self.assertIsInstance(f.widget, SplitDateTimeWidget) self.assertEqual( datetime.datetime(2006, 1, 10, 7, 30), f.clean([datetime.date(2006, 1, 10), datetime.time(7, 30)]) ) with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean(None) with self.assertRaisesMessage(ValidationError, "'This field is required.'"): f.clean('') with self.assertRaisesMessage(ValidationError, "'Enter a list of values.'"): f.clean('hello') with self.assertRaisesMessage(ValidationError, "'Enter a valid date.', 'Enter a valid time.'"): f.clean(['hello', 'there']) with self.assertRaisesMessage(ValidationError, "'Enter a valid time.'"): f.clean(['2006-01-10', 'there']) with self.assertRaisesMessage(ValidationError, "'Enter a valid date.'"): f.clean(['hello', '07:30'])
class EditPartyForm(ModelForm): """ Form to edit party details. """ party_start = SplitDateTimeField( input_date_formats=["%m/%d/%Y", "%Y-%m-%d"], input_time_formats=["%I:%M %p"], label="Party Start Date / Time:") preparty_start = TimeField(input_formats=["%I:%M %p"], label="Preparty Start Time:") jobs = FileField(required=False, label="Party Jobs:") def clean(self): cleaned_data = super().clean() preparty_start = cleaned_data.get('preparty_start') party_start = cleaned_data.get('party_start') has_preparty = cleaned_data.get('has_preparty') if preparty_start >= party_start.time() and has_preparty: self.add_error('party_start', "Party must start after preparty") self.add_error('preparty_start', "Preparty must start before the party") class Meta: model = Party fields = ('name', 'party_start', 'has_party_invite_limits', 'max_party_invites', 'has_preparty', 'preparty_start', 'has_preparty_invite_limits', 'max_preparty_invites', 'jobs') labels = { 'max_party_invites': "Max Party Invites:", 'has_preparty': "Does this event have a pre-party check-in?", 'max_preparty_invites': "Max Preparty Invites:", 'has_party_invite_limits': "Does the party have limited invites?", 'has_preparty_invite_limits': "Does the preparty have limited invites?", }
class EventForm(Form): name = forms.CharField(label='Nom de l\'évènement', max_length=100, required=True) location = forms.CharField(label='Emplacement', max_length=255, required=False) event_date_start = SplitDateTimeField( label='Date de début de l\'évènement', widget=DateTimePickerWidget, initial=timezone.now()) event_duration = DurationField(initial=timedelta(hours=1), label="Durée de l\'évènement") banner = forms.ImageField(required=False, label='Bannière', widget=ImageSelectorWidget) description = forms.CharField( label='Description', widget=MarkdownWidget, required=True, initial=render_to_string("event_description_template.md"))
class StoryFormChangeForm(ModelForm): image_upload = forms.URLField(required=False, help_text='If image path is left blank, a randomly generated image will appear in your article', widget=forms.TextInput(attrs={'class': "form_entry"})) CHOICES = [('1','Awful'),('2','Average'),('3','Okay'),('4','Good'),('5','Fantastic')] Food_rating=forms.CharField(label='Overall Experience Rating', widget=forms.RadioSelect(choices=CHOICES)) pub_date = SplitDateTimeField( # use split date time field to allow the user to input both date and time widget=SplitDateTimeWidget( # we use the split date time widget to specify how the html gets built date_attrs={'type': 'date', 'class':'form_entry'}, # type date tells django to use the HTML5 date input time_attrs={'type': 'time','class':'form_entry'}, # type time tells django to use the HTML5 time input ) ) class Meta: model = NewsStory fields = ['title','Restaurant', 'pub_date','image_upload','content','cuisine_type'] widgets = { "content": forms.Textarea( attrs={'placeholder': 'We cannot wait to hear where you have eaten and what it was like!','class':'form_entry' }, ) , "title": forms.TextInput( attrs={ 'class':'form_entry'} ) , "Restaurant": forms.TextInput( attrs={ 'class':'form_entry'} ) }
class StoryForm(ModelForm): pub_date = SplitDateTimeField(widget=SplitDateTimeWidget( date_attrs={'type': 'date'}, time_attrs={'type': 'time'}, )) class Meta: model = NewsStory fields = ['title', 'pub_date', 'content', 'image'] widgets = { 'title': forms.TextInput(attrs={ 'class': 'form', 'class': 'inputbox', 'placeholder': 'Title Name' }), 'content': forms.Textarea( attrs={ 'class': 'form', 'class': 'inputbox', 'placeholder': 'Enter Content Here' }) }
class EventFilter(django_filters.FilterSet): start_time = SplitDateTimeField(widget=widgets.AdminSplitDateTime()) class Meta: model = Event fields = ('categories', 'location', 'start_time')
def test_splitdatetimefield_changed(self): f = SplitDateTimeField(input_date_formats=['%d/%m/%Y']) self.assertFalse(f.has_changed(['11/01/2012', '09:18:15'], ['11/01/2012', '09:18:15'])) self.assertTrue(f.has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['2008-05-06', '12:40:00'])) self.assertFalse(f.has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:40'])) self.assertTrue(f.has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), ['06/05/2008', '12:41']))
class EventForm(ModelForm): date = SplitDateTimeField(label='Termin spotkania', widget=SplitDateTimeWidget(date_attrs={ 'type': 'text', 'class': 'datepicker', 'placeholder': 'np. 01-01-2018' }, time_attrs={ 'type': 'text', 'class': 'timepicker', 'placeholder': 'np. 20:30' }), input_date_formats=settings.DATE_INPUT_FORMATS) tags = ModelCommaSeparatedChoiceField( label='Tagi', queryset=Tag.objects.all(), to_field_name='name', required=False, help_text= "Dodaj tagi, aby Twoje spotknie było łatwiejsze do odnalezienia. Każdy tag musi być oddzielony od kolejnego przecinkiem (np. piłka nożna, hala)." ) class Meta: model = Event fields = [ 'title', 'category', 'city', 'city_area', 'min_number_of_participants', 'max_number_of_participants', 'description', ] labels = { 'title': 'Tytuł spotkania', 'category': 'Kategoria', 'city': 'Miasto', 'city_area': 'Obszar miasta', 'min_number_of_participants': 'Minimalna liczba uczestników', 'max_number_of_participants': 'Maksymalna liczba uczestników', 'description': 'Opis spotkania', } widgets = { 'category': RadioSelect(), 'description': Textarea(attrs={'class': 'materialize-textarea'}) } def __init__(self, *args, **kwargs): super(EventForm, self).__init__(*args, **kwargs) instance = getattr(self, 'instance', None) if instance and instance.pk: self.fields['title'].disabled = True self.fields['category'].disabled = True, self.fields['city'].disabled = True, self.fields['description'].disabled = True, self.fields['tags'].disabled = True, def clean_date(self): date = self.cleaned_data['date'] if date < timezone.now() + timezone.timedelta(minutes=30): raise ValidationError( 'Nie możesz stworzyć spotkania, do rozpoczęcia którego zostało mniej niż 30 minut.' ) return date def clean(self): cleaned_data = super(EventForm, self).clean() if cleaned_data['min_number_of_participants'] and cleaned_data[ 'min_number_of_participants'] > cleaned_data[ 'max_number_of_participants']: raise ValidationError( 'Minimalna liczba uczestników musi być mniejsza od maksymalnej liczby uczestników spotkania.' ) return cleaned_data
def __init__(self, *args, **kwargs): super(ContractorScheduleForm, self).__init__(*args, **kwargs) self.fields['start_date'] = SplitDateTimeField() self.fields['end_date'] = SplitDateTimeField()
class EventOccurrenceInlineForm(ModelForm): WIDGET_FORMATS = ['%I:%M%p','%I:%M %p','%I:%M','%H:%M:%S','%H:%M'] startTime = SplitDateTimeField(required=True,label=_('Start Date/Time'),input_time_formats=WIDGET_FORMATS) endTime = SplitDateTimeField(required=True,label=_('End Date/Time'),input_time_formats=WIDGET_FORMATS)
class EventForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['photo_path'].widget.attrs['list'] = "photo_paths" self.fields['photo_path'].widget.attrs['autocomplete'] = "off" def clean(self): super().clean() start = self.cleaned_data.get('start_time') end = self.cleaned_data.get('end_time') end_ins = self.cleaned_data.get('end_inscriptions') management_type = self.cleaned_data.get('gestion') photo_path = self.cleaned_data.get('photo_path') allow_extern = self.cleaned_data.get('allow_extern') end_extern_inscriptions = self.cleaned_data.get( 'end_extern_inscriptions') if allow_extern and not end_extern_inscriptions: self.add_error( 'allow_extern', 'Vous ne pouvez pas autoriser les externes sans mettre de date limite' ) if start is None or end is None or end_ins is None: return if end <= start: self.add_error( 'start_time', "Le début de l'événement doit se situer avant sa fin...") if end_ins > start: self.add_error( 'end_inscriptions', "La fin des inscriptions doit se situer avant le début de l'évènement" ) if management_type == Event.GESTION_NOLIMIT: if photo_path: realpath = os.path.join(settings.MEDIA_ROOT, 'photo', photo_path) os.makedirs(realpath, exist_ok=True) def as_p(self): return super().as_p() + mark_safe('''<script> create_calendar("id_end_inscriptions_0") create_calendar("id_start_time_0") create_calendar("id_end_time_0") create_calendar("id_invitations_start_0") create_calendar("id_end_extern_inscriptions_0") </script> ''') start_time = SplitDateTimeField(label="Début") end_time = SplitDateTimeField(label="Fin") end_inscriptions = SplitDateTimeField(label="Fin des inscriptions") end_extern_inscriptions = SplitDateTimeField( label="Fin des inscriptions externes", required=False) invitations_start = SplitDateTimeField(label="Début des invitations", required=False) class Meta: model = Event exclude = ["uuid", "model"] labels = { 'name': "Nom", 'location': "Lieu", 'private': "Privé", 'allow_extern': "Autoriser les exterieurs", 'limited': "Nombre d'inscriptions limité", 'max_inscriptions': "Nombre maximum d'inscriptions", 'allow_invitations': "Autoriser les invitations", 'max_invitations': "Nombre maximum d'invitations", 'max_invitations_by_person': "Nombre maximum d'invitations par personne", 'photo': "Photo (max 2Mio)", 'photo_path': 'Chemin pour les photos' } widgets = { 'photo': WrapperClearableinput, }
class EventOccurrenceInlineForm(ModelForm): startTime = SplitDateTimeField(required=True, label=_('Start Date/Time')) endTime = SplitDateTimeField(required=True, label=_('End Date/Time'))
class TradeForm(ModelForm): tradeDateTime = SplitDateTimeField() def __init__(self, *args, **kwargs): kwargs['data']._mutable = True kwargs['data']['car'] = kwargs['data']['car'].split(' ')[0] kwargs['data']._mutable = False super(TradeForm, self).__init__(*args, **kwargs) def clean(self): cd = super(TradeForm, self).clean() if 'car' not in cd: self.errors.pop( 'car' ) # Removing English error message and then adding Uzbek error message if self.data['car'] == '': self.add_error('car', 'Mashina raqami bo\'sh bo\'lmasligi kerak') else: self.add_error( 'car', 'Siz kiritgan "' + self.data['car'] + '" mashina topilmadi') return cd if 'petrol' not in cd: self.errors.pop( 'petrol' ) # Removing English error message and then adding Uzbek error message if self.data['petrol'] == '': self.add_error('petrol', 'Benzin nomi bo\'sh bo\'lmasligi kerak') else: self.add_error( 'petrol', 'Siz kiritgan "' + self.data['petrol'] + '" benzini topilmadi') return cd if 'litre' not in cd: self.errors.pop( 'litre' ) # Removing English error message and then adding Uzbek error message if self.data['litre'] == '': self.add_error('litre', 'Sotilgan Litr bo\'sh bo\'lmasligi kerak') else: self.add_error('litre', 'Sotilgan Litrni to\'g\'ri formatda kiriting') return cd else: litre = Decimal(cd['litre']) if litre <= 0: self.add_error('litre', 'Sotilgan litr 0 dan katta bo\'lishi kerak') return cd if litre > settings.PETROL_BONUS_LIMIT: self.add_error('litre', 'Sotilgan Litr miqdori juda katta') return cd return cd def is_valid(self): return super(TradeForm, self).is_valid() class Meta: model = Trade fields = ['car', 'petrol', 'litre', 'tradeDateTime']
class TestForm(Form): datetime = SplitDateTimeField()
class TestForm(Form): template_name = "forms_tests/use_fieldset.html" field = SplitDateTimeField(widget=self.widget)