![Proper Forms](header.png)
Proper Forms is a flexible form library to make far easier to create beautiful, semantically rich, syntactically awesome, readily stylable and wonderfully accessible HTML forms in your Python web application.
**Documentation**: https://proper-forms.scaletti.dev
```bash
pip install proper-forms
```
## How Proper Forms is different
- A field isn't tied to a specific HTML tag, so can be presentend in multiple ways. Even the same form can be used in different contexts and have different widgets and styles on each. A set of options as checkboxes, a select multiple, or a comma-separated input? You got it. A date as a calendar or as three selects? No problem.
- Many commonly used built-in validators, and you can also write simple functions to use as custom ones.
- Any field can accept multiple values; as a list or as a comma-separated text.
- All error messages are customizable. The tone of the messages must be able to change or to be translated.
- Incredible easy to integrate with any ORM (object-relational mapper). Why should you need *another* library to do that?
## Just show me how it looks
```python
from proper_forms import Form, Email, Text
class CommentForm(Form):
email = Email(required=True, check_dns=True)
message = Text(
LongerThan(5, "Please write a longer message"),
required=True
)
def comment():
form = CommentForm(request.POST)
if request.method == "POST" and form.validate():
data = form.save()
...
return render_template("comment.html", form=form)
```
Raw data
{
"_id": null,
"home_page": "https://proper-forms.scaletti.dev/",
"name": "proper_forms",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9,<4.0",
"maintainer_email": "",
"keywords": "",
"author": "Juan-Pablo Scaletti",
"author_email": "juanpablo@jpscaletti.com",
"download_url": "https://files.pythonhosted.org/packages/36/84/9cde148c9615f2b610ce1b3e814b53208c9d666466007eaab6107d292b44/proper_forms-0.8.tar.gz",
"platform": null,
"description": "![Proper Forms](header.png)\n\nProper Forms is a flexible form library to make far easier to create beautiful, semantically rich, syntactically awesome, readily stylable and wonderfully accessible HTML forms in your Python web application.\n\n**Documentation**: https://proper-forms.scaletti.dev\n\n\n```bash\npip install proper-forms\n```\n\n## How Proper Forms is different\n\n- A field isn't tied to a specific HTML tag, so can be presentend in multiple ways. Even the same form can be used in different contexts and have different widgets and styles on each. A set of options as checkboxes, a select multiple, or a comma-separated input? You got it. A date as a calendar or as three selects? No problem.\n\n- Many commonly used built-in validators, and you can also write simple functions to use as custom ones.\n\n- Any field can accept multiple values; as a list or as a comma-separated text.\n\n- All error messages are customizable. The tone of the messages must be able to change or to be translated.\n\n- Incredible easy to integrate with any ORM (object-relational mapper). Why should you need *another* library to do that?\n\n\n## Just show me how it looks\n\n```python\nfrom proper_forms import Form, Email, Text\n\n\nclass CommentForm(Form):\n email = Email(required=True, check_dns=True)\n message = Text(\n \tLongerThan(5, \"Please write a longer message\"),\n \trequired=True\n )\n\n\ndef comment():\n form = CommentForm(request.POST)\n if request.method == \"POST\" and form.validate():\n \tdata = form.save()\n ...\n return render_template(\"comment.html\", form=form)\n\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A proper flexible Python form library",
"version": "0.8",
"project_urls": {
"Homepage": "https://proper-forms.scaletti.dev/",
"Repository": "https://github.com/jpsca/proper-forms"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2bfbd87e64f242ef28382b2b4bbcc619d2b8c37d12f9d5560019eff20c03d129",
"md5": "96fee5cd0004a330f0ae7ddbceb1b041",
"sha256": "706ada401847613b5dac9a44a1bf22afa8e01a44b3883f1007dab2d894daabca"
},
"downloads": -1,
"filename": "proper_forms-0.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "96fee5cd0004a330f0ae7ddbceb1b041",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9,<4.0",
"size": 25905,
"upload_time": "2024-01-18T15:29:09",
"upload_time_iso_8601": "2024-01-18T15:29:09.139132Z",
"url": "https://files.pythonhosted.org/packages/2b/fb/d87e64f242ef28382b2b4bbcc619d2b8c37d12f9d5560019eff20c03d129/proper_forms-0.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "36849cde148c9615f2b610ce1b3e814b53208c9d666466007eaab6107d292b44",
"md5": "e481f1e3aee52085d453db075cd96943",
"sha256": "7ca7a06aec0268ef53d15f04f40f60923c15baf8cd2136f42dde871c71dcfe3f"
},
"downloads": -1,
"filename": "proper_forms-0.8.tar.gz",
"has_sig": false,
"md5_digest": "e481f1e3aee52085d453db075cd96943",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9,<4.0",
"size": 18145,
"upload_time": "2024-01-18T15:29:10",
"upload_time_iso_8601": "2024-01-18T15:29:10.322818Z",
"url": "https://files.pythonhosted.org/packages/36/84/9cde148c9615f2b610ce1b3e814b53208c9d666466007eaab6107d292b44/proper_forms-0.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-18 15:29:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jpsca",
"github_project": "proper-forms",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "proper_forms"
}