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:
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:
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:
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
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."
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