Validation

Djing provides a variety of ways to validate your resource fields.

Unless you like to live dangerously, any Djing fields that are displayed on the Djing creation / update pages will need some validation. Thankfully, it’s a cinch to attach all of the PyJinx validation rules you’re familiar with to your Djing resource fields. Let’s get started.

Rules

Attaching Rules

When defining a field on a resource, you may use the rules method to attach validation rules to the field:

djing_admin/app/Djing/User.py
from djing.core.Fields.Text import Text
from djing.core.Http.Requests.DjingRequest import DjingRequest
from djing_admin.app.Djing.Resource import Resource as DjingResource

class User(DjingResource):
    # ...

    def fields(self, request: DjingRequest):
        return [
            Text.make("Name")
                .rules("required", "max:255"),
        ]

Creation Rules

If you would like to define rules that only apply when a resource is being created, you may use the creation_rules method:

djing_admin/app/Djing/User.py
from djing.core.Fields.Text import Text
from djing.core.Http.Requests.DjingRequest import DjingRequest
from djing_admin.app.Djing.Resource import Resource as DjingResource
from ding_admin.app.Rules.Unique import Unique
from django.contrib.auth import get_user_model

UserModel = get_user_model()

class User(DjingResource):
    # ...

    def fields(self, request: DjingRequest):
        return [
            Text.make("Name")
                .rules("required", "max:255")
                .creation_rules([Unique(UserModel, "email")]),
        ]

Update Rules

Likewise, if you would like to define rules that only apply when a resource is being updated, you may use the update_rules method. If necessary, you may use resource_id place-holder within your rule definition. This place-holder will automatically be replaced with the primary key of the resource being updated:

djing_admin/app/Djing/User.py
from djing.core.Fields.Text import Text
from djing.core.Http.Requests.DjingRequest import DjingRequest
from djing_admin.app.Djing.Resource import Resource as DjingResource
from ding_admin.app.Rules.Unique import Unique
from django.contrib.auth import get_user_model

UserModel = get_user_model()

class User(DjingResource):
    # ...

    def fields(self, request: DjingRequest):
        return [
            Text.make("Name")
                .rules("required", "max:255")
                .creation_rules([Unique(UserModel, "email")])
                .update_rules(
                    [Unique(UserModel, "email", request.route_param("resource_id"))]
                ),
        ]

Available Rules

PyJinx provides built in validation rules, It is highly inspired by Laravel Validation, so you can safely use Laravel validation rules syntax:

accepted_if
accepted
between
decimal
email
gt
gte
integer
lt
lte
max
min
nullable
numeric
required_if
required
size
sometimes

Custom Validation Rule

While Djing provides enough validation rules, sometimes you need your own specific logic for validation, In such case, you can create a custom validation rule using Djing CLI:

commander djing:rule Unique

This command will create a custom validation rule inside djing_admin/app/Rules/Unique.py

djing_admin/app/Rules/Unique.py
from Illuminate.Validation.Rule import Rule


class Unique(Rule):
    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)

    def validate(self) -> bool:
        # you can also validate minimum number of arguments passed using
        self.require_params_count(2)

        # you can access params using
        field = self.params.get("field") # email
        value = self.params.get("value") # johndoe@example.com

        # also, you can now access passed arguments using
        user_model = self.args.get(0)
        attribute = self.args.get(1)
        resource_id = self.args.get(2)

        # after that you can create a custom logic to validate request and then
        # return True or False based on validation logic.
        return True

    # You can also implement get_message method to overwrite validation message
    def get_message(self) -> str:
        return "custom validation message."
djing_admin/app/Djing/User.py
from djing.core.Fields.Text import Text
from djing.core.Http.Requests.DjingRequest import DjingRequest
from djing_admin.app.Djing.Resource import Resource as DjingResource
from ding_admin.app.Rules.Unique import Unique
from django.contrib.auth import get_user_model

UserModel = get_user_model()

class User(DjingResource):
    # ...

    def fields(self, request: DjingRequest):
        return [
            Text.make("Name")
                .rules("required", "max:255")
                .creation_rules([Unique(UserModel, "email")])
                .update_rules(
                    [Unique(UserModel, "email", request.route_param("resource_id"))]
                ),
        ]

Last updated