# Decorators
## render_html
Decorator that provides a convienent way to render HTML from a function-based view.
**`render_html` with `template_name` argument in `views.py`**
```python
from fbv.decorators import render_html
@render_html("sample-html-template.html")
def sample_html_view(request):
return {"data": 123}
```
**`render_html` with `TEMPLATE` dictionary key in `views.py`**
```python
from fbv.decorators import render_html
@render_html()
def sample_html_view(request):
return {"TEMPLATE": "sample-html-template.html", "data": 123}
```
**`render_html` with no template specified in `views.py`**
This will use the current module and function name as the template name.
For example, the following would look for a `views/sample_html_view.html` template.
```python
from fbv.decorators import render_html
@render_html()
def sample_html_view(request):
return {"data": 123}
```
```{note}
`render_html` is just an alias for `render_view` below that sets the content type to `text/html; charset=utf-8`.
```
## render_view
Includes all the functionality of the `html_view`, but allows the response content type to be set.
**`render_view` in `views.py`**
```python
from fbv.decorators import render_view
@render_view("sample-xml-template.xml", content_type="application/xml")
def sample_xml_view(request):
return {"data": 123}
```
## render_json
Decorator that provides a convienent way to return a `JSONResponse` from a function-based view. `dictionary`, Django `Model`, and Django `QuerySet` objects are all rendered automatically by `render_json`.
````{note}
By default, the rendered JSON won't have whitespaces between keys and values for the most compact representation as possible. However, you can override that functionality by passing in a `tuple` as `(item_separator, key_separator)`.
**`render_json` in `views.py`**
```python
from fbv.decorators import render_json
@render_json()
def sample_json_view(request):
return {"data": 123, "test": 456}
```
**Default JSON response**
```json
{"data":123,"test":456}
```
**`render_json` with `separators` in `views.py`**
```python
from fbv.decorators import render_json
@render_json(separators=(", ", ": "))
def sample_json_view(request):
return {"data": 123, "test":456}
```
**Separators JSON response**
```json
{"data": 123, "test": 456}
```
````
### dictionary
**`render_json` in `views.py`**
```python
from fbv.decorators import render_json
@render_json()
def sample_json_view(request):
return {"data": 123}
```
**`dictionary` JSON response**
```json
{ "data": 123 }
```
### Django `Model`
**`render_json` Django `Model` in `views.py`**
```python
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json()
def sample_json_model_view(request):
user = User.objects.get(id=1)
return user
```
**Django `Model` JSON response**
```json
{
"pk": 1,
"username": "testuser1",
"first_name": "Test 1",
"last_name": "User 1",
"email": "testuser1@test.com"
}
```
### Specifying model fields
To only return some of the model fields, pass in a `fields` kwarg with a `tuple` of field names.
**`render_json` Django `Model` in `views.py`**
```python
from django.contrib.auth.models import User
from fbv.decorators import render_json
@render_json(fields=("username", ))
def sample_json_model_view(request):
user = User.objects.get(id=1)
return user
```
**Django `Model` JSON response**
```json
{
"username": "testuser"
}
```
### Django `QuerySet`
**`render_json` Django `QuerySet` in `views.py`**
```python
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()
return users
```
**Django `QuerySet` JSON response**
```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"
}
]
```
### Specifying QuerySet model fields
To only return some of the QuerySet's model fields, pass in a `fields` kwarg with a `tuple` of field names.
**`render_json` Django `QuerySet` with fields in `views.py`**
```python
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
```
**Django `QuerySet` with fields JSON response**
```json
[
{
"username": "testuser1"
},
{
"username": "testuser2"
}
]
```
### Using `QuerySet.values()`
To only return some of the QuerySet's model fields, call `QuerySet.values()` with the field names.
**`render_json` Django `QuerySet.values()` in `views.py`**
```python
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
```
**Django `QuerySet.values()` JSON response**
```json
[
{
"first_name": "Test "
},
{
"first_name": "Test 2"
}
]
```