# Decorators
## render_html
Decorator that provides a convienent way to render HTML from a function-based view.
```{note}
`render_html` is an alias for `render_view` that sets the content type to `text/html; charset=utf-8`.
```
### Decorator argument
The following would look for `decorator-arg.html` as the template.
```python
# sample_app/views.py
from fbv.decorators import render_html
@render_html("decorator-arg.html")
def sample_html_view(request):
return {"data": 123}
```
### Context key
The following would look for `context-key.html` as the template.
```python
# sample_app/views.py
from fbv.decorators import render_html
@render_html()
def sample_html_view(request):
return {"TEMPLATE": "context-key.html", "data": 123}
```
### Derived template
If no template is specified, the current module and function name are used for the template.
The following would look for `derived_template.html` as the template.
```python
# sample_app/views.py
from fbv.decorators import render_html
@render_html()
def derived_template(request):
return {}
```
For nested view files, the following would look for `example/derived_template_2.html` as the template.
```python
# sample_app/views/example.py
from fbv.decorators import render_html
@render_html()
def derived_template_2(request):
return {}
```
## render_view
Similar to `render_html`, but allows the response content type to be set.
```python
# sample_app/views.py
from fbv.decorators import render_view
@render_view("sample-xml-template.xml", content_type="application/xml")
def xml_view(request):
return {"data": 123}
```
## render_json
Returns a `JSONResponse` from a function-based view. `dictionary`, Django `Model`, and Django `QuerySet` objects are all rendered automatically.
````{note}
By default, the rendered JSON won't have whitespaces between keys and values for the most compact representation possible. However, you can override that functionality by passing in a `tuple` as `(item_separator, key_separator)`.
```python
# sample_app/views.py
from fbv.decorators import render_json
@render_json(separators=(", ", ": "))
def sample_json_view(request):
return {"data": 123,"test":456}
```
Or overriding just the item or key separators.
```python
# sample_app/views.py
from fbv.decorators import render_json
@render_json(item_separator=", ", key_separator=": ")
def sample_json_view(request):
return {"data": 123,"test":456}
```
```json
{"data": 123, "test": 456}
```
````
### Dictionary
```python
# sample_app/views.py
from fbv.decorators import render_json
@render_json()
def dictionary_json_view(request):
return {"data": 123}
```
```json
{
"data": 123
}
```
### `Model`
```python
# sample_app/views.py
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json()
def model_json_view(request):
user = User.objects.get(id=1)
return user
```
```json
{
"pk": 1,
"username": "testuser1",
"first_name": "Test 1",
"last_name": "User 1",
"email": "testuser1@test.com"
}
```
### `Model` fields
To only return some of the model fields, pass in a `fields` kwarg with a `tuple` of field names.
```python
# sample_app/views.py
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json(fields=("username",))
def model_fields_json_view(request):
user = User.objects.get(id=1)
return user
```
```json
{
"username": "testuser"
}
```
### `QuerySet`
```python
# sample_app/views.py
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json()
def queryset_json_view(request):
users = User.objects.all()
return users
```
```json
[
{
"pk": 1,
"username": "testuser1",
"first_name": "Test 1",
"last_name": "User 1",
"email": "testuser1@test.com"
},
{
"pk": 2,
"username": "testuser2",
"first_name": "Test 2",
"last_name": "User 2",
"email": "testuser2@test.com"
}
]
```
### `QuerySet` fields
To only return some of the QuerySet's model fields, pass in a `fields` kwarg with a `tuple` of field names.
```python
# sample_app/views.py
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json(fields=("username",))
def sample_json_queryset_view(request):
users = User.objects.all()
return users
```
```json
[
{
"username": "testuser1"
},
{
"username": "testuser2"
}
]
```
### `QuerySet` values
To only return some of the QuerySet's model fields, call `QuerySet.values()` with the field names.
```python
# sample_app/views.py
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json()
def sample_json_queryset_view(request):
users = User.objects.all().values("first_name")
return users
```
```json
[
{
"first_name": "Test 1"
},
{
"first_name": "Test 2"
}
]
```