# Forms

Purpose of this document is to introduce you to differences and features of forms module available in `misago.core.forms` package.

For proper introduction to forms, see [Django documentation](https://docs.djangoproject.com/en/%7B%7B%20book.django_version%20%7D%7D/topics/forms/).

Because Misago relies on JSON API endpoints to change application state by users, bulk of forms are be written as React.js components making AJAX requests to different `/api/` edges, either bypassing the forms altogether, or using them purely for data validation and cleaning.

Misago's admin uses [Crispy Forms](http://django-crispy-forms.readthedocs.org/en/latest/) app that allows to easily display forms using `Bootstrap 3` markup.

Finally, Misago defines few custom field types:

### `misago.core.forms.YesNoSwitch`

Thin wrapper around Django's `TypedChoiceField`. In admin this field renders nice yes/no switch as its input.

#### Warning!

`YesNoSwitch` coerces its value to `int` (eg. `0` or `1`)! Remember about this when writing code dealing with forms containing this field!

## Template tags

Misago defines custom templates extension named `misago_forms`. This extension contains two template tags for rendering form fields:

### `form_row`

This tag takes form field as its first argument and renders field complete with label, help and errors. Accepts two extra arguments: label class and field class, allowing you to control size of horizontal forms:

```
{% load misago_forms %}

{% form_row form.somefield %}
{% form_row form.otherfield 'col-md-3' 'col-md-9' %}
```

### `form_input`

This tag takes form field as its only argument and renders it's input.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://misago.gitbook.io/docs/forms.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
