1. 程式人生 > 其它 >django中通過form表單提交資料

django中通過form表單提交資料

https://www.cnblogs.com/shenyexiaoqingxin/p/10676090.html

目標:

①、初始form的簡單應用

②、使用Django的form元件完成新增一個帖子

方法一:普通方法

1、前端表單程式碼

<div>
    <form class="navbar-form navbar-left" role="search" method="post">
        {%csrf_token%}
  <div class="form-group">
    <input type="text" class="form-control" name="article_title" placeholder="帖子標題">
    <input type="text" class="form-control" name="article_prief" placeholder="帖子小標題">
    <input type="text" class="form-control" name="article_content"placeholder="帖子內容">

  </div>
  <button type="submit" class="btn btn-default">提交</button>
</form>

2、view中新增一個檢視方法:

#新增一個帖子
def add(request):
    article_title=request.POST.get('article_title',"");
    article_prief=request.POST.get('article_prief',"");
    article_content = request.POST.get('article_content', "");
    add_article=Article(article_title=article_title,article_prief_content=article_prief,article_content=article_content);--------->這是插入一篇帖子的方法
    add_article.save();


    
return render(request,'add.html',{ 'article_title':article_title, 'article_prief':article_prief, 'article_content': article_content, })

3、除錯結果:正常

方法二:使用form表單(建議!!!)
使用form表單的意義,可以對錶單進行自動校驗,包括各項資料均可以在表單類中定義好,客戶端只需要渲染就可以了

1、新建一個forms.py的python檔案

from django import forms-------->必須引入
from django import forms
class login_form(forms.Form):
#新增一個form類,在form中加入元素,比如下面,加入兩個字串,客戶端的label名稱定義,輸入的最大值(指定後無法輸入更多字元),
輸入的最小值(指定後若少於該值會提示),指定錯誤資訊(這是一個字典型別)
username=forms.CharField(label='使用者名稱',min_length=2,max_length=5,error_messages={"required":"使用者名稱不能為空"});
#即使什麼都沒有設定,它也已經幫你設定了預設不能為空
pwd=forms.CharField(label="密碼");

2、在view中新增一個檢視函式

def login_2(request):
    form_obg = forms.login_form();//必須先例項化表單
    if request.method=="POST":
        form_obg = forms.login_form(request.POST);---->將前端提交上來的欄位加入表單
        if form_obg.is_valid():---------------->通過表單中定義的規則對錶單的所有資料進行檢查,如果檢查通過,說明驗證通過
            return HttpResponse("登陸成功");
    return render(request,"login2.html",{'form_obj':form_obg});---------->最終都要返回表單欄位

3、前端html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊2</title>
</head>
<body>
    <form action="/login/login2" method="post" novalidate autocomplete="off">
        {% csrf_token %}
        <div>
            <label for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>---------->bootstrap的label有一個for屬性
            {{ form_obj.username }} {{ form_obj.username.errors.0 }}----------------->這個是文字框(就是charField,文字域),輸入的規則後臺指定,錯誤
        </div>
        <div>
            <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
            {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
        </div>
        <div>
            <input type="submit" class="btn btn-success" value="註冊">
        </div>
    </form>
</body>
</html>

4、除錯結果如下:正常

上面已經描述了怎麼使用Django的form表單,接下來,我們會通過Django的form表單來實現新增一個帖子

1、在forms.py中新增一個form類

class article_form(forms.Form):
    article_title=forms.CharField(label='帖子名稱');
    article_prief=forms.CharField(label='小標題名稱');
    article_content=forms.CharField(label='帖子內容');

2、在view.py檢視檔案中新增一個檢視方法

def add_article(request):
    form_obj_1=forms.article_form();
    if request.method=="POST":
        form_obj_1=forms.article_form(request.POST);
        if form_obj_1.is_valid():
            article_title = request.POST.get("article_title", "");
            article_prief = request.POST.get("article_prief", "");
            article_content = request.POST.get("article_content", "");
            add_article = Article(article_title=article_title, article_prief_content=article_prief,
                                  article_content=article_content);
            add_article.save();
            return HttpResponse("新增成功");
    return render(request,"add.html",{'form_obj_1':form_obj_1});

3、前端程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊2</title>
</head>
<body>
    <form action="/login/login2" method="post" novalidate autocomplete="off">
        {% csrf_token %}
        <div>
            <label for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>
            {{ form_obj.username }} {{ form_obj.username.errors.0 }}
        </div>
        <div>
            <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
            {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
        </div>
        <div>
            <input type="submit" class="btn btn-success" value="註冊">
        </div>
    </form>
</body>
</html>

4、最終除錯結果

進入後臺檢視(剛才新增的資料存在,說明新增功能正常)

================關於form的一些驗證=========================

class article_form(forms.Form):
#給文字框增加輸入長度的判斷,若超多或不夠,給出error_message article_title=forms.CharField(label='帖子名稱',min_length=10,max_length=200,error_messages={"required":"不能為空","min_length":u"長度不能小於10"});
#給文字框增加預設灰色文案 article_prief=forms.CharField(label='小標題名稱',widget=forms.TextInput(attrs={"class":"form-control","placeholder":u"小標題"}));
#將文字框變成多行文字框 article_content=forms.CharField(label='帖子內容',widget=forms.widgets.Textarea(attrs={"class":"form-control","placeholder":u"詳細內容","row":3}));

效果如下: