Package: django-rest-form-fields
django-rest-form-fieldsExtended form fields to validate REST-request data via django.forms.RequirementsPython 3.7+Other versions may also work but not tested automaticallyDjango 2.2+Other versions may also work but not tested automaticallytypingjsonschemaOptional. Required for validating json schema inJsonFieldand its child classespytzOptional. Required forTimezoneFieldInstallationInstall via pip:pip install django-rest-form-fieldsor via setup.py:python setup.py installUsageYou can use standarddjango forms, adding new fields for them.
All*argsand**kwargsfields in reference below will be passed to base django constructors as is.Example:fromdjangoimportformsfromdjango_rest_form_fieldsimportFileField,ArrayFieldclassMyForm(forms.Form):file_field=FileField(max_size=1024,valid_extensions=['valid_extensions'])array_field=ArrayField(min_items=1,max_items=10)Base formsSince version 1.2.2 this library also contains base form classes.
Together with library fields, they give ability to change field's source attribute.
To have this feature, just inherit your class from BaseForm or BaseModelForm:fromdjango_rest_form_fields.formsimportBaseFormfromdjango_rest_form_fields.fieldsimportRestIntegerFieldclassMyForm(BaseForm):int_field=RestIntegerField(source='intField')f=MyForm({'intField':123})f.full_clean()print(f.cleaned_data['int_field'])# Outputs: 123Fields and their optionsRestCharField(*args, source: Optional[str] = None, **kwargs)Wraps django.forms.forms.CharField:Changes default value - None, not empty stringFixes initial value (CharField returns empty string, ignoring 'initial' parameter and None value)Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]RegExField(*args, regex: Optional[str] = None, flags: int = 0, source: Optional[str] = None, **kwargs)RestCharField child class, that automatically validates given string with regex (re.match function)If regex parameter is specified and value matches expression, you can get MatchObject using fieldmatchattributeParameters:regex: str - regular expression string or compiled withre.compile()objectflags: int - optional validate flagssource: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]RestChoiceField(*args, choices: Optional[Iterable[Union[str, Tuple[str]]]] = None, source: Optional[str] = None, **kwargs)Wraps django.forms.forms.ChoiceField:Changes default value - None, not empty stringFixes initial value (ChoiceField returns empty string, ignoring 'initial' parameter and None value)Gives opportunity to set 'choices' as iterable of values, not iterable of tuplesParameters:choices: Optional[Iterable[Union[str, Tuple[str]]]] - values this field can have.
It can be an iterable of strings or iterable of tuples[inner_name: str, human_name: str].source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]RestIntegerField(*args, source: Optional[str] = None, **kwargs)RestFloatField(*args, source: Optional[str] = None, **kwargs)Wrap django.forms.forms.IntegerField and django.forms.forms.FloatField, fixing initial value (Base fields returns None, ignoring 'initial' parameter and None value)Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[int/float]PositiveIntegerField(*args, with_zero: bool = False, source: Optional[str] = None, **kwargs)IdField(*args, with_zero: bool = False, source: Optional[str] = None, **kwargs)Child of RestIntegerField, validating value as positive integer
Parameters:with_zero: bool - if False, 0 will cause validation errorsource: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[int]TimestampField(*args, in_future: bool = True, source: Optional[str] = None, **kwargs)Child of RestFloatField. Gets timestamp value and converts it intodatetime.datetimeobject in UTC.
Parameterinitialcan be float ordatetime.datetimevalue.Parameters:in_future: bool - if False, datetime is validated to be less thandjango.utils.timezone.now()source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[datetime.datetime]DateTimeField(*args, mask: str = "%Y-%m-%dT%H:%M:%S", source: Optional[str] = None, **kwargs)Child of RestCharField. Parses datetime string todatetime.datetimevalue.
Parameters:mask: str - template fordatetime.strptimefunctionsource: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[datetime.datetime]MonthField(*args, mask: str = "%Y-%m", source: Optional[str] = None, **kwargs)Child of DateTimeField. Parses month string todatetime.datevalue.
Returns date of the first day of the month.
Parameters:mask: str - template fordatetime.strptimefunctionsource: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[datetime.date]TimezoneField(*args, source: Optional[str] = None, **kwargs)Child of RestCharField. Validates string as one of pytz timezone names.Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]DateUnitField(*args, source: Optional[str] = None, **kwargs)Child of RestChoiceField, validating value as one of [hour, day, week]Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]RestBooleanField(*args, source: Optional[str] = None, **kwargs)Standarddjango.forms.forms.BooleanFieldis based on /django/forms/widgets.pyCheckboxInput.value_from_datadict(value)It works improperly for REST model:required=True+value=False=>ValidationErrorThis filed fixes this issue, giving opportunity to send False (required or not):None as default value'false', '0', '' (ignoring case) as FalseEverything else is parsed with standard bool functionParameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]LowerCaseEmailField(*args, source: Optional[str] = None, **kwargs)Wrapsdjango.forms.forms.EmailField:Converts email string to lowercaseFixes initial value bug (EmailField returns empty string, ignoring 'initial' parameter)Changes default value - None, not empty stringParameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]ColorField(*args, source: Optional[str] = None, **kwargs)Child of RestCharField, validating color.
Color should be six hexadecimal characters.Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]TruncatedCharField(*args, truncate_length: int = 255, source: Optional[str] = None, **kwargs)Child of RestCharField, which truncates given value, leaving first truncate_length characters.Parameters:truncate_length: Optional[int] - If None, acts as RestCharField. If integer - number of characters to leave.source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]JsonField(*args, json_schema: Optional[dict], source: Optional[str] = None, **kwargs)Child of RestCharField. Validates, that value is dict, list or JSON-encoded string.
If string - decodes it.Parameters:json_schema: Optional[dict] - Object to validate given JSON withjsonschema package.source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[Any]ArrayField(*args, min_items: int = 0, max_items: Optional[int] = None, item_schema: Optional[dict] = None, source: Optional[str] = None, **kwargs)JsonField child. Validates array. It can be represented in 3 forms:list instanceJSON-encoded arraycomma-separated stringParameters:min_items: int - Validates array has more or equal itemsmax_items: Optional[int] - Validates array has less or equal itemsitem_schema: Optional[dict] - Object to validate every item withjsonschema package.source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[List[Any]]IdArrayField(*args, source: Optional[str] = None, **kwargs)ArrayField child. Validates array of IdField().Each array element is cleaned with IdField().Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[List[int]]IdSetField(*args, source: Optional[str] = None, **kwargs)IdArrayField child. Validates set of IdField().Each element is cleaned with IdField(). Removes duplicated ids from input, if needed.Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[Set[int]]UrlField(*args, with_underscore_domain: Optional[bool] = True, source: Optional[str] = None, **kwargs)RegexField child. Validates string as URL withdjango.core.validators.URLValidatorParameters:with_underscore_domain: Optional[bool] - allow domain with underscore character.source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]HexField(*args, source: Optional[str] = None, **kwargs)RestCharField child. Validates that string has hexadecimal characters only.Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]UUIDField(*args, source: Optional[str] = None, **kwargs)RegexField child. Validates field to be correct UUID.Parameters:source: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[str]FileField(*args, max_size: Optional[int] = None, valid_extensions: Optional[List[str]] = None, source: Optional[str] = None, **kwargs)Wraps django.forms.forms.FileField:Fixes initial value bug (FileField returns empty string, ignoring 'initial' parameter)Adds validation parametersParameters:max_size: Optional[int] - File size in bytesvalid_extensions: Optional[List[str]] - file extensions (without .), that are validsource: Optional[str] - name of attribute to get data from. Defaults to form attribute name.Resulting value:Optional[file]Running testsRunning in dockerInstalldocker and docker-composeRundocker build . --tag django-rest-form-fieldsin project directoryRundocker-compose run run_testsin project directoryRunning in virtual environmentInstall pythonCreate virtual environmentInstall pip requirementspip3 install -U -r requirements-test.txtStart testspython3 runtests.py