# Validators

Misago apps implement plenty of validators, some of which are considered public API. Those validators are per convention contained within `validators` module of their respective apps.

## `misago.core.validators.validate_sluggable`

Callable class that validates if string can be converted to non-empty slug thats no longer than 255 characters.

To you use it, first instantiate it. If you want to define custom error messages, you can pass them using `error_short` and `error_long` arguments on initializer. After that you can simply call the class like other validator functions to see if it raises `ValidationError`:

```python
from misago.core.validators import validate_sluggable
validator = validate_sluggable()
validator(some_value)
```

## `misago.users.validators`

### `validate_email.misago.users.validators.validate_email(value, exclude=None)`

Function that takes email address and runs content, availability and ban check validation in this order via calling dedicated validators. Optional `exclude` argument can be `User` instance to exclude from certain validation like uniqueness checks.

### `validate_email_banned.misago.users.validators.validate_email_banned(value)`

Function that accepts email string as its only argument and raises Validation error if it's banned.

### `validate_email_content.misago.users.validators.validate_email_content(value)`

Callable instance of `django.core.validators.EmailValidator` that checks if email address has valid structure and contents.

### `validate_password.misago.users.validators.validate_password(value)`

Function that takes plaintext password and runs length and complexity validation in this order via calling dedicated validators.

### `validate_password_complexity.misago.users.validators.validate_password_complexity(value)`

Validates password complexity against tests specified in `password_complexity` setting.

### `validate_password_length.misago.users.validators.validate_password_length(value)`

Validates password length and raises ValidationError if specified plaintext password is shorter than `password_length_min`.

### `validate_username.misago.users.validators.validate_username(value, exclude=None)`

Function that takes username and runs content, length, availability and ban check validation in this order via calling dedicated validators. Optional `exclude` argument can be `User` instance to exclude from certain validation like uniqueness checks.

### `validate_username_available.misago.users.validators.validate_username_available(value, exclude=None)`

Function that accepts username string as its only argument and raises ValidationError if it's already taken. Optional `exclude` argument can be `User` instance to exclude from certain validation like uniqueness checks.

### `validate_username_banned.misago.users.validators.validate_username_banned(value)`

Function that accepts username string as its only argument and raises Validation error if it's banned.

### `validate_username_content.misago.users.validators.validate_username_content(value)`

Function that accepts username string as its only argument and raises Validation error if username contains disallowed characters (eg. those that are not matched by `[0-9a-z]+` regex).

### `validate_username_length.misago.users.validators.validate_username_length(value)`

Function that accepts username string as its only argument and raises Validation error if it's shorter than `username_length_min` setting or longer than `username_length_max` setting.


---

# 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/validators.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.
