Heim Backend-Entwicklung Python-Tutorial Python的Django框架中forms表单类的使用方法详解

Python的Django框架中forms表单类的使用方法详解

Jul 21, 2016 pm 02:53 PM
django python 表单

Form表单的功能

  • 自动生成HTML表单元素
  • 检查表单数据的合法性
  • 如果验证错误,重新显示表单(数据不会重置)
  • 数据类型转换(字符类型的数据转换成相应的Python类型)

Form相关的对象包括

  • Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的
  • Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误。
  • Form:一系列Field对象的集合,负责验证和显示HTML元素
  • Form Media:用来渲染表单的CSS和JavaScript资源。

Form Objects

Form对象封装了一系列Field和验证规则,Form类都必须直接或间接继承自django.forms.Form,定义Form有两种方式:

方法一:直接继承Form

from django import forms
class ContactForm(forms.Form):
 subject = forms.CharField(max_length=100,label='主题')
 message = form.CharField(widget=forms.TextArea)
 sender = form.EmailField()
 cc_myself = forms.BooleanField(required=False)
Nach dem Login kopieren

方法二:结合Model,继承django.forms.ModelForm

#models.py
class Contact(models.Model):
 title = models.CharField(max_length=30)
 content = models.CharField(max_length=20)

#form.py
class ConotactForm(ModelForm):
 class Meta:
 model = Contact
 field = ('title','content') #只显示model中指定的字段

Nach dem Login kopieren

在视图(view)中使用form

在view函数中使用form的一般情景是:

view.py:

form django.shortcuts import render
form django.http import HttpResponseRedirect

def contact(request):
 if request.method=="POST":
  form = ContactForm(request.POST)
  if form.is_valid(): #所有验证都通过
   #do something处理业务
   return HttpResponseRedirect('/')
 else:
  form = ContactForm()
 return render(request,'contact.html',{'form':form})

Nach dem Login kopieren

contact.html:

<form action='/contact/' method='POST'>
 {% for field in form %}
  <div class = 'fieldWrapper'>
   {{field.label_tag}}:{{field}}
   {{field.errors}}
  </div>
 {% endfor %}
 <div class='fieldWrapper'> <p><input type='submit' value='留言'></p></div>
</form>
Nach dem Login kopieren

处理表单数据

form.is_valid()返回true后,表单数据都被存储在form.cleaned_data对象中(字典类型,意为经过清洗的数据),而且数据会被自动转换为Python对象,如:在form中定义了DateTimeField,那么该字段将被转换为datetime类型,还有诸如:IntegerField、FloatField

if form.is_valid():
 subject = form.cleaned_data['subject']
 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

Nach dem Login kopieren

Form的简单使用方法就这些。 另:

在模版中显示表单的几种方式:

显示form找template中的方法多种多样,也可以自定义:

<form action="/contact/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
Nach dem Login kopieren

还可以使用form.as_table、form.as_ul,分别表示用

标签,

标签和
    表示显示表单。如果要自定义,你只要获取到每个元素的值就行:

    <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&#63;</label>
      {{ form.cc_myself }}
     </div>
     <p><input type="submit" value="Send message" /></p>
    </form>
    
    Nach dem Login kopieren

    每个form字段都可以使用 {{form.name_of_field}}得到。

    也可以通过迭代form,每个迭代元素对应的是form里面的field

    <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>
    
    Nach dem Login kopieren

    {{field}}有如下属性:

    {{field.lable}},如:Email address
    {{field.label_tag}},如: <label for=id_email>Email address</label>
    {{field.value}} 如:someone.@gmail.com
    {{field.errors}}
    
    Nach dem Login kopieren

    实例:构建表单
    第一步:首先在models.py中定义一个表单模型

    class RemarkForm(forms.Form):
      subject = forms.CharField(max_length=100 ,label='留言标题')
      mail = forms.EmailField(label='电子邮件')
      topic = forms.ChoiceField(choices=TOPIC_CHOICES,label='选择评分') 
      message = forms.CharField(label='留言内容',widget=forms.Textarea)
      cc_myself = forms.BooleanField(required=False ,label='订阅该贴')
    
    
    Nach dem Login kopieren

    那个topic中的choices需要在models.py中定义一个数组.

    TOPIC_CHOICES = (
      ('leve1', '差评'),
      ('leve2', '中评'),
      ('leve3', '好评'),
    )
    
    Nach dem Login kopieren

    这样,之后在html显示的表单就采用这个模型的数据了。

    另外还有一种定义表单模型的方式,那就是直接继承另一个models。如果我们在models里设计数据库时,已经设计好了一个类(就是数据库的表)之后想复用这个类的信息来作为表单的模型,那么很简单,同样是在models中的一个类

    class Advertisement(models.Model): 
     #订单编号
     OrderID =  models.ForeignKey(OrderInfo)
     #//广告标题#
     Title = models.CharField(max_length = 36) 
     #//广告内容#
     Content = models.CharField(max_length = 600)
    
    Nach dem Login kopieren

    注意,他的类型是models.Model,是做数据库ORM用的。

    然后怎么关联呢?
    需要导入一个新的类 (ModelForm)

    from django.forms import ModelForm
    
    class ContactForm(ModelForm):
     class Meta:
     model = Advertisement
     fields = ('Title', 'CustomerID')
    
    
    Nach dem Login kopieren

    这里的Advertisement就是之前那个ORM的模型。
    第二步:OK,继续我们的表单,下一步需要做什么呢?开始在views.py里写对表单的调用吧.
    def remark(request):

      if request.method == 'POST': # 如果表单被提交
        form = ContactForm(request.POST) # 获取Post表单数据
        if form.is_valid(): # 验证表单
          return HttpResponseRedirect('/') # 跳转
      else:
        form = ContactForm() #获得表单对象
        
      return render_to_response('message.html', {
        'form': form,
      })
    
    Nach dem Login kopieren


    整个代码很简单,我就不过多的解释了。


    第三步:我们知道django里任何访问都是通过urls.py来管理的。所以下面我们需要配置一个路径。

     (r'^message', 'iring.views.remark'),
    Nach dem Login kopieren

    第四步:最后应该是建立一个模板的时候了,因为我们最终是输出到html上的.注意views的remark函数最后一行

      return render_to_response('message.html', {
        'form': form,
      })
    
    Nach dem Login kopieren

    就是讲当前的表单对象输出到message.html里,自动生成一个表单。
    所以,先构建一个html.
    这个html模板很简单,除去不必要的CSS,我只给出核心部分好啦。

     <form action="/message/" method="POST">
     {% for field in form %}
      <div class="fieldWrapper">
       {{ field.label_tag }}:{{ field }} 
       {{ field.errors }}
      div>
     {% endfor %}
     <div class="fieldWrapper"><p><input type="submit" value="留言" />p>div>
     form>
    
    Nach dem Login kopieren

    {% for field in form %}
    
    {% endfor %}
    
    
    Nach dem Login kopieren

    用于对表单对象里的元素进行遍历,然后通过

    {{ field.label_tag }}
    {{ field }} 
    {{ field.errors }}
    
    Nach dem Login kopieren

    这三个标签来输出,注意{{ field.errors }}默认情况下是不会输出的,只有当验证表单正确性时才会输出内容。

    最终我们通过:
    http://youdjangourl/message来访问这个例子

    2016621145313568.jpg (463×521)

    2016621145344436.jpg (433×383)

    2016621145405787.jpg (434×350)

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Muss MySQL bezahlen? Muss MySQL bezahlen? Apr 08, 2025 pm 05:36 PM

    MySQL hat eine kostenlose Community -Version und eine kostenpflichtige Enterprise -Version. Die Community -Version kann kostenlos verwendet und geändert werden, die Unterstützung ist jedoch begrenzt und für Anwendungen mit geringen Stabilitätsanforderungen und starken technischen Funktionen geeignet. Die Enterprise Edition bietet umfassende kommerzielle Unterstützung für Anwendungen, die eine stabile, zuverlässige Hochleistungsdatenbank erfordern und bereit sind, Unterstützung zu bezahlen. Zu den Faktoren, die bei der Auswahl einer Version berücksichtigt werden, gehören Kritikalität, Budgetierung und technische Fähigkeiten von Anwendungen. Es gibt keine perfekte Option, nur die am besten geeignete Option, und Sie müssen die spezifische Situation sorgfältig auswählen.

    Hadidb: Eine leichte, horizontal skalierbare Datenbank in Python Hadidb: Eine leichte, horizontal skalierbare Datenbank in Python Apr 08, 2025 pm 06:12 PM

    Hadidb: Eine leichte, hochrangige skalierbare Python-Datenbank Hadidb (HadIDB) ist eine leichte Datenbank in Python mit einem hohen Maß an Skalierbarkeit. Installieren Sie HadIDB mithilfe der PIP -Installation: PipinstallHadIDB -Benutzerverwaltung erstellen Benutzer: createUser (), um einen neuen Benutzer zu erstellen. Die Authentication () -Methode authentifiziert die Identität des Benutzers. fromHadidb.operationImportUseruser_obj = user ("admin", "admin") user_obj.

    Navicat -Methode zum Anzeigen von MongoDB -Datenbankkennwort Navicat -Methode zum Anzeigen von MongoDB -Datenbankkennwort Apr 08, 2025 pm 09:39 PM

    Es ist unmöglich, das MongoDB -Passwort direkt über Navicat anzuzeigen, da es als Hash -Werte gespeichert ist. So rufen Sie verlorene Passwörter ab: 1. Passwörter zurücksetzen; 2. Überprüfen Sie die Konfigurationsdateien (können Hash -Werte enthalten). 3. Überprüfen Sie Codes (May Hardcode -Passwörter).

    Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Apr 08, 2025 pm 06:03 PM

    Die MySQL-Datenbankleistung Optimierungshandbuch In ressourcenintensiven Anwendungen spielt die MySQL-Datenbank eine entscheidende Rolle und ist für die Verwaltung massiver Transaktionen verantwortlich. Mit der Erweiterung der Anwendung werden jedoch die Datenbankleistung Engpässe häufig zu einer Einschränkung. In diesem Artikel werden eine Reihe effektiver Strategien zur Leistungsoptimierung von MySQL -Leistung untersucht, um sicherzustellen, dass Ihre Anwendung unter hohen Lasten effizient und reaktionsschnell bleibt. Wir werden tatsächliche Fälle kombinieren, um eingehende Schlüsseltechnologien wie Indexierung, Abfrageoptimierung, Datenbankdesign und Caching zu erklären. 1. Das Design der Datenbankarchitektur und die optimierte Datenbankarchitektur sind der Eckpfeiler der MySQL -Leistungsoptimierung. Hier sind einige Kernprinzipien: Die Auswahl des richtigen Datentyps und die Auswahl des kleinsten Datentyps, der den Anforderungen entspricht, kann nicht nur Speicherplatz speichern, sondern auch die Datenverarbeitungsgeschwindigkeit verbessern.

    Python: Erforschen der primären Anwendungen Python: Erforschen der primären Anwendungen Apr 10, 2025 am 09:41 AM

    Python wird in den Bereichen Webentwicklung, Datenwissenschaft, maschinelles Lernen, Automatisierung und Skripten häufig verwendet. 1) In der Webentwicklung vereinfachen Django und Flask Frameworks den Entwicklungsprozess. 2) In den Bereichen Datenwissenschaft und maschinelles Lernen bieten Numpy-, Pandas-, Scikit-Learn- und TensorFlow-Bibliotheken eine starke Unterstützung. 3) In Bezug auf Automatisierung und Skript ist Python für Aufgaben wie automatisiertes Test und Systemmanagement geeignet.

    Wie man AWS -Kleber mit Amazon Athena verwendet Wie man AWS -Kleber mit Amazon Athena verwendet Apr 09, 2025 pm 03:09 PM

    Als Datenprofi müssen Sie große Datenmengen aus verschiedenen Quellen verarbeiten. Dies kann Herausforderungen für das Datenmanagement und die Analyse darstellen. Glücklicherweise können zwei AWS -Dienste helfen: AWS -Kleber und Amazon Athena.

    Der 2-stündige Python-Plan: ein realistischer Ansatz Der 2-stündige Python-Plan: ein realistischer Ansatz Apr 11, 2025 am 12:04 AM

    Sie können grundlegende Programmierkonzepte und Fähigkeiten von Python innerhalb von 2 Stunden lernen. 1. Lernen Sie Variablen und Datentypen, 2. Master Control Flow (bedingte Anweisungen und Schleifen), 3.. Verstehen Sie die Definition und Verwendung von Funktionen, 4. Beginnen Sie schnell mit der Python -Programmierung durch einfache Beispiele und Code -Snippets.

    Kann MySQL mit dem SQL -Server eine Verbindung herstellen? Kann MySQL mit dem SQL -Server eine Verbindung herstellen? Apr 08, 2025 pm 05:54 PM

    Nein, MySQL kann keine direkt zu SQL Server herstellen. Sie können jedoch die folgenden Methoden verwenden, um die Dateninteraktion zu implementieren: Verwenden Sie Middleware: Exportieren Sie Daten von MySQL in das Zwischenformat und importieren sie dann über Middleware in SQL Server. Verwenden von Datenbank -Linker: Business -Tools bieten eine freundlichere Oberfläche und erweiterte Funktionen, die im Wesentlichen weiterhin über Middleware implementiert werden.

    See all articles