首页 > 解决方案 > 如何在不使用 django 表单的情况下验证 django 中的模板版本化表单字段?

问题描述

我编写了一个小型身份验证应用程序,在其中使用了手动模板渲染。我可以从表单中获取和更新数据,但我只想验证这些字段。但是我无法继续前进,因为我没有使用任何 Django 表单模型。客户端验证正在进行中,但是服务器端验证呢。

使用 python v3 和 Django v2 我没有使用 forms 模型没有从 forms.py 继承。那我怎么验证??我的注册模板文件。`

        <form action="{% url 'register' %}" method="post">
            {% csrf_token %}
            {% for message in messages %}
            <div class="alert {% if message.tags %} alert-{{ message.tags }}{% endif %}">{{ message|safe }}</div>
        {% endfor %}

            <h3>Registration Form</h3>
            <div class="form-group">
                <input type="text" name="first_name" placeholder="First Name" class="form-control" required>
                <input type="text" name="last_name" placeholder="Last Name" class="form-control" required>
            </div>
            <div class="form-wrapper">
                <input type="text" name="email" placeholder="Email Address" class="form-control" required>
                <i class="zmdi zmdi-email"></i>
            </div>
            <div class="form-wrapper">
                <input type="text" name="phone" placeholder="Phone" class="form-control" required>
                <i class="zmdi zmdi-phone"></i>
            </div>
            <div class="form-wrapper">
                <input type="password" name="password1" placeholder="Password" class="form-control" required>
                <i class="zmdi zmdi-lock"></i>
            </div>
            <div class="form-wrapper">
                <input type="password" name="password2" placeholder="Confirm Password" class="form-control"
                       required>
                <i class="zmdi zmdi-lock"></i>
            </div>
            <button>Register
                <i class="zmdi zmdi-arrow-right"></i>
            </button>
        </form>
    </div>
</div>

`视图.py

def register(request):
if request.method == "POST":
    first_name = request.POST['first_name']
    last_name = request.POST['last_name']
    phone = request.POST['phone']
    email = request.POST['email']
    password1 = request.POST['password1']
    password2 = request.POST['password2']
    if password1 == password2:
        if User.objects.filter(phone=phone).exists():
            messages.info(request, 'Requested phone exists')
        elif User.objects.filter(email=email).exists():
            messages.info(request, 'Requested email exists')
            return redirect('register')
        else:
            user = User.objects.create_complete_user(first_name=first_name, last_name=last_name, phone=phone,
                                                     email=email, password=password1)
            user.save()
            messages.info(request, 'successfully user object is created')
            return redirect('login')
    else:
        messages.info(request, 'Passwords not matching')
    return redirect('register')
else:
    return render(request, 'signup.html')

标签: django-forms

解决方案


我能想到的将表单与 Django 分开添加的唯一情况是,当您的前端和后端分开并且它们通过 API 进行通信时。如果是这种情况,您应该使用序列化程序进行验证。更多细节在这里:https ://www.django-rest-framework.org/api-guide/serializers/

如果您在 Django 中有特殊情况,并且仍想使用编码的 HTML 表单,您还需要创建一个 Django 表单来反映您在 HTML 中制作的表单。假设您有以下 HTML 输入类型:

<form>
<input type="email" name="my_email">
<input type="text" name="my_text">
<input type="file" name="my_file">
</form>

您在 django 中的表单必须相同

#forms
class Myform(forms.Form):
    my_email = forms.EmailField()
    my_text = forms.CharField()
    my_file = forms.FileField()

# view
def myview(request):
    myform = Myform(request.POST, request.FILES)
    if myform.is_valid():
        # Cleaned and validated data
        my_email = myform.cleaned_data["my_email"]
        my_text = myform.cleaned_data["my_text"]
        my_file = myform.cleaned_data["my_file"]
        # Do here whatever you need to do with

切勿保存未经验证和清理的数据。

# Never do this.
def myview(request):
    my_email = request.POST["my_email"]
    request.user.email = my_email
    request.user.save()

注意:这是未经测试的代码,可能无法按原样工作。但它可以作为你应该做什么的一个例子。


推荐阅读