在django中验证单个字段,而不使用表单或模型

gzszwxb4  于 2023-01-18  发布在  Go
关注(0)|答案(2)|浏览(148)

我正在使用django来填充一些表单,我知道如何使用表单和验证,但我的表单很复杂,很难从这些表单创建表单对象。我想知道有没有办法在视图中对我从POST获得的参数使用验证器?
例如,我有一个名为user的字段,那么

def login_view(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        user=request.POST["user"]
        # check whether it's valid without using forms

我知道验证器https://docs.djangoproject.com/en/dev/ref/validators/,但看起来它们只适用于modelsforms。有没有可能验证单个字段?如果没有,我有什么其他选项来验证复杂的表单?

taor4pac

taor4pac1#

Validator只是一个接收表单值的函数,如果值有效,则不执行任何操作,如果值无效,则引发ValidationError。
您可以将Validator导入到视图中并在那里调用它。
使用名为custom_validate_user的验证器时,可能如下所示:

def login_view(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        user=request.POST["user"]
        try:
            custom_validate_user(user)
        except ValidationError as e:
            # handle the validation error

尽管如此,如果你有复杂的表单,你的视图可能会变得混乱,如果你直接在适当的地方处理整个验证,因此你通常把这个逻辑封装在一个表单中,或者确保在模型级别上进行验证。

hxzsmxv2

hxzsmxv22#

如果您有一个User模型,您可以在其中定义验证器,并在需要时重用它。

from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator

def validate_str_not_empty(value: str):
    if not value:
        raise ValidationError("Should not be empty")

validate_str_no_whitespace = RegexValidator(
    regex=r"^\S*$",
    message="Should not contain whitespace",
)

class MyUser(models.Model):
    name = models.CharField(
        validators=[validate_str_not_empty, validate_str_no_whitespace],
    )

调用一个字段的验证器的函数(类似于model.clean_fields(),但在一个字段上运行):

def clear_one_field(instance: models.Model, field_name: str) -> Any:
    """
    Run validators on one field of the model.

    Similar to `model.clean_fields()` but run on one field instead of all fields.

    :param instance: A model instance
    :param field_name: Name of the field to "clean"
    :raises ValidationError: If field value is not valid
    :return: The "cleaned" value of the field
    """
    raw_value = getattr(instance, field_name)
    return instance._meta.get_field(field_name).clean(raw_value, instance)

使用它:

def login_view(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        user_name=request.POST["user"]
        clear_one_field(MyUser(name=user_name), "name")

相关问题