Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2426104

Browse files
documented async model form's validation and constructor
1 parent bd9681f commit 2426104

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

‎docs/forms/model_form.md‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,67 @@ class AuthorForm(AsyncModelForm):
2929
fields = ("name",)
3030
```
3131

32+
#### Construction
33+
34+
normally you instantiate a field like this:
35+
`form = AuthorForm(data)`
36+
and that works fine
37+
38+
but sometimes you pass in an instance to the form (e.g: you are building an update view)
39+
```pycon
40+
>>> author = Author.objects.get(pk=1)
41+
>>> form = AuthorForm(instance=author)
42+
```
43+
44+
in this case, you will probably face an error saying you can't do synchronous operations in an async environment
45+
for situations like this, we provide an alternative contractor called `from_async()`
46+
47+
```pycon
48+
author = await Author.objects.aget(pk=1)
49+
form = await AuthorForm.from_async(instance=author)
50+
```
51+
52+
note that `from_async()` is an async method that should be `await`ed
53+
54+
#### validation
55+
if a validator requires database access (e.g: unique validator) you will face a problem in async views
56+
to solve that, we provide a few methods
57+
58+
* ais_valid
59+
```python
60+
if await form.ais_valid():
61+
# handle data
62+
```
63+
an awaitable version of django's [Form.is_valid](https://docs.djangoproject.com/en/5.1/ref/forms/api/#django.forms.Form.is_valid)
64+
65+
* aerrors (property)
66+
```pycon
67+
>>> errors = await form.aerrors
68+
```
69+
an awaitable version of django's [Form.errors](https://docs.djangoproject.com/en/5.1/ref/forms/api/#django.forms.Form.errors)
70+
71+
* afull_clean
72+
```python
73+
await form.afull_clean()
74+
```
75+
an awaitable version of django's `Form.full_clean`, you typically don't call this manually.
76+
77+
78+
79+
#### Manual form rendering
80+
django's templating system is fully sync, so you can't call async methods and functions in the templates
81+
you can call sync methods and render the page using `asgiref.sync.sync_to_async`, or you can gather the data in your view and pass them in as context.
82+
83+
a few methods have been provided so forms can be rendered manually:
84+
85+
1. arender: an `await`able version of django's [Form.render](https://docs.djangoproject.com/en/5.1/ref/forms/api/#render)
86+
2. aas_div: an `await`able version of django's [Form.as_div](https://docs.djangoproject.com/en/5.1/ref/forms/api/#as-div)
87+
3. aas_p: an `await`able version of django's [Form.as_p](https://docs.djangoproject.com/en/5.1/ref/forms/api/#django.forms.Form.as_p)
88+
4. aas_ul: an `await`able version of django's [Form.as_ul](https://docs.djangoproject.com/en/5.1/ref/forms/api/#as-ul)
89+
5. aas_table: an `await`able version of django's [Form.as_table](https://docs.djangoproject.com/en/5.1/ref/forms/api/#as-table)
90+
91+
92+
note that the sync versions are still available.
3293

3394
___
3495
**WARNING!**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /