• 9:django 表单


    django自带表单系统,这个表单系统不仅可以定义属性名,还可以自己定义验证,更有自己自带的错误提示系统

    这节我们仅仅粗略的来看一下django表单系统的入门运用(具体的实在太多东西,主要是我觉得有很多东西不是很适合现在的我使用,等以后需要的时候再回来看看吧)

    定义表单

    from django import forms
    #所有的表单类都应该是forms.Form的子类
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length=100)
        message = forms.CharField()
        sender = forms.EmailField()
        cc_myself = forms.BooleanField(required=False)

    如果你想在现有的model建立表单,可以这样写

    from django.forms import ModelForm
    # Create the form class.
    class ArticleForm(ModelForm):
        class Meta:
            model = Article

    在视图函数中使用表单

    from django.shortcuts import render
    from django.http import HttpResponseRedirect
    
    def contact(request):
        if request.method == 'POST': # If the form has been submitted...
            form = ContactForm(request.POST) # A form bound to the POST data
            if form.is_valid(): # All validation rules pass
                # Process the data in form.cleaned_data
                subject = form.cleaned_data['subject']#使用cleaned_data而不是request.POST,因为前者前者不仅已经通过验证并且都是所有的内容都已经转成了符合python标准的类型
                message = form.cleaned_data['message']
                sender = form.cleaned_data['sender']
                cc_myself = form.cleaned_data['cc_myself']
    
                recipients = ['info@example.com']
                if cc_myself:
                    recipients.append(sender)
    
                from django.core.mail import send_mail
                send_mail(subject, message, sender, recipients)
                return HttpResponseRedirect('/thanks/') # Redirect after POST
        return HttpResponseRedirect('/thanks/') # Redirect after POST else: form = ContactForm() # An unbound form return render(request, 'contact.html', { 'form': form, })

    在模板中使用表单

    <form action="/contact/" method="post">
    {% csrf_token %}<!-- djnago 强制使用跨站点请求伪造保护(Cross Site Request Forgery protection)-->
    {{ form.as_p }}
    <input type="submit" value="Submit" />
    </form>

    form.as_p的效果如下:

    <p><label for="id_subject">Subject:</label>
        <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
    <p><label for="id_message">Message:</label>
        <input type="text" name="message" id="id_message" /></p>
    <p><label for="id_sender">Sender:</label>
        <input type="text" name="sender" id="id_sender" /></p>
    <p><label for="id_cc_myself">Cc myself:</label>
        <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>

    如果你不想使用django默认的模板,可以自定义自己的模板,示例如下

    <form action="/contact/" method="post">
        {{ form.non_field_errors }}
        <div class="fieldWrapper">
            {{ form.subject.errors }}
            <label for="id_subject">Email subject:</label>
            {{ form.subject }}
        </div>
        <div class="fieldWrapper">
            {{ form.message.errors }}
            <label for="id_message">Your message:</label>
            {{ form.message }}
        </div>
        <div class="fieldWrapper">
            {{ form.sender.errors }}
            <label for="id_sender">Your email address:</label>
            {{ form.sender }}
        </div>
        <div class="fieldWrapper">
            {{ form.cc_myself.errors }}
            <label for="id_cc_myself">CC yourself?</label>
            {{ form.cc_myself }}
        </div>
        <p><input type="submit" value="Send message" /></p>
    </form>

    你可以这样遍历表单域

    <form action="/contact/" method="post">
        {% for field in form %}
            <div class="fieldWrapper">
                {{ field.errors }}
                {{ field.label_tag }}: {{ field }}
            </div>
        {% endfor %}
        <p><input type="submit" value="Send message" /></p>
    </form>

    下面是每个{{filed}}都应该有的属性

    {{ field.label }}
    The label of the field, e.g. Email address.
    {{ field.label_tag }}
    The field’s label wrapped in the appropriate HTML <label> tag, e.g. <label for="id_email">Email address</label>
    {{ field.value }}
    The value of the field. e.g someone@example.com
    {{ field.html_name }}
    The name of the field that will be used in the input element’s name field. This takes the form prefix into account, if it has been set.
    {{ field.help_text }}
    Any help text that has been associated with the field.
    {{ field.errors }}
    Outputs a <ul class="errorlist"> containing any validation errors corresponding to this field. You can customize the presentation of the errors with a {% for error in field.errors %} loop. In this case, each object in the loop is a simple string containing the error message.
    field.is_hidden
    This attribute is True if the form field is a hidden field and False otherwise. It’s not particularly useful as a template variable, but could be useful in conditional tests such as:
    
    {% if field.is_hidden %}
       {# Do something special #}
    {% endif %}

    p

  • 相关阅读:
    数组最值和两种排序
    整数翻转,99乘法表,百钱买百鸡
    运算符综合练习题
    五子棋实现体验其过程
    二维数组斜线扫描2(方法逻辑清晰)
    字符串链接练习题
    母串中有几个相同的子串
    递归求菲波拉契前N项的和
    [LeetCode] Mini Parser
    Linked List 小结
  • 原文地址:https://www.cnblogs.com/qwj-sysu/p/4193830.html
Copyright © 2020-2023  润新知