簡體   English   中英

如何使用下拉列表在 Django 中創建提交表單?

[英]How can I create a submit form in Django with a dropping down list?

我剛剛開始使用 Django,我在表單和下拉列表方面遇到了一些問題。

我有一個具有兩個屬性的模型,我想在下拉列表中顯示其中一個屬性(這個是不可更改的),另一個在文本字段中顯示(這個可以更改)。 另外,我有一個提交按鈕,所以我想更改文本字段中的第二個屬性並按下按鈕。 我怎樣才能做到這一點? 一些例子是什么?

當您開始使用 Django 時,您可能知道也可能不知道 Django 如何處理表單。

在 Django 中,可以通過兩種方式處理表單:

  1. 用戶創建和管理的表單(沒有任何表單類)
  2. 類管理的表單(連接到 Django 模型)

文檔形式 Django Forms

現在讓我們談談第一種類型的表單(您可以在其中創建 HTML 表單並管理發送到服務器的請求):

這些表格制作起來很簡單,而且只有少數表格,並且僅在您有非常少量的輸入(我會說四個或更少的輸入)時才建議使用。

這是訂閱帶有電子郵件示例的時事通訊的簡單示例。

<form id='sub-form' method="POST">
    {% csrf_token %}
    <div>
         <input type="email" name="sub_email">
    </div>
    <input class="button" value="Subscribe" type="submit" id="subbutton">
</form>

因此,這里要查看的一件非常重要的事情是{% csrf_token %} ,您可以在此處閱讀有關它的更多信息以及它的工作原理和防止跨站點請求偽造 當您使用任何發布請求和數據向 Django 服務器發出請求時,將需要此令牌。

在此訂閱表單中,您會看到一個<input>帶有name="sub_email" 請注意這一點,因為我們將使用它在服務器上獲取此值,因為這是其key ,然后是一個簡單的提交按鈕

當您在頁面上按提交時,假設url = " http://BASE_URL/home"您將在處理該 URL 的視圖上收到一個POST請求。

所以現在來到view.py ,假設您只允許注冊用戶訂閱,那么視圖將是這樣的(假設您不期望來自主 URL 的任何其他請求)。

def home(request):
    user=request.user
    if request.method == "POST":
        if user.is_authenticated:
            email = request.POST['sub_email'] #Using name of input
            #Logic to save this email
            return HttpResponse("You are Subscribed",status=200)
        else:
            return HttpReposnse("You are not Authenticated",status=401)
    else:
        return render(request,"home.html")

現在您是簡單表單的專家,讓我們使用基於 Django 類的表單。


當您的輸入很少時,這些視圖會有點工作,但是當您必須處理大量輸入時,它們對可管理性有很大幫助。

您將請求這些基於類的表單,因為在您的問題中,您嘗試將模型實例從Models.py發送到表單給用戶。

我有一個可用於此示例的帖子模型:

class Post(models.Model):
    postTitle = models.CharField(max_length = 90,null=True)
    subTitle = models.CharField(max_length = 160,null=True)
    location = models.CharField(max_length = 3,default = 'IN',null=True)

現在根據您的問題,您正試圖讓用戶更改一個屬性,比如說postTitle ,對於位置,您不會讓用戶選擇預先選擇的國家之一並用於您的帖子。

現在我們必須為此創建一個表單。 基於類的表單是在Forms.py中創建的。 如果您沒有forms.py,那么您可以直接創建一個models.pyviews.py

表單.py

現在對於表單,我想編輯一些現有數據,因為您說其中一個屬性(字段)是固定的,另一個是可編輯的,但是您從模型中獲得了值。

class PostEditForm(ModelForm):
    location = forms.CharField(label='Country ',widget=forms.Select(attrs={'class': 'Classes_HERE','placeholder':' Select a Country','disabled':'disabled'} ,choices=country_list),required=True)

    class Meta:
        model = Post
        fields= ['postTitle','subTitle','location']
        labels = {
            'postTitle':'Title',
            'subTitle':'Sub-Title',
        }
        widgets = {
            'postTitle': forms.TextInput(attrs={'class': 'mention_class_here','placeholder':' Add Title'}),
            'subTitle': forms.TextInput(attrs={'class': 'mention_class_here','placeholder':' Add Sub-Title'})
        }

屬性可以在表單字段中提到,就像我在上面的例子中提到的那樣。 我使用disabled="disabled"禁用不可編輯)位置字段並使用forms.Select使其下拉。

您可能還會看到我為位置字段提供了一個可供選擇的列表。 這是您創建項目列表的方式。 我寫這篇文章已經有一段時間了,所以可能有錯誤或者它可能對你不起作用,所以請確保你參考了當前的文檔並在 Stack Overflow 上搜索答案。

country_list = [
    ('', 'Select a Country'),
    ("AF", "Afghanistan"),
    ("AX", "Aland Islands"),
    ("AL", "Albania"),
    ("DZ", "Algeria"),
    ("AS", "American Samoa"),
    ("AD", "Andorra"),
    ("AO", "Angola"),
    ("AI", "Anguilla"),
    ("AQ", "Antarctica"),
    ("AG", "Antigua And Barbuda"),
    ("AR", "Argentina"),
    ("AM", "Armenia"),
    ("AW", "Aruba"),
.
.
.

現在,此表單可以作為視圖中的上下文傳遞給 HTML 頁面。

def editPost(request,post_id):
    user=request.user
    post = get_object_or_404(Post,id=post_id) #Getting the instance of Post
    if user.is_authenticated:
        formPost = PostEditForm(request.POST or None,instance=post)

        if request.method=='POST':
            if formPost.is_valid():
                    savedPost=formPost.save()
        else:
            return render(request,'postEdit.html',{'formPost':formPost})
    else:
        return HttpResponse("Not Authorized",status:401)

現在你的 HTML 文件postEdit.html應該是這樣的:

<form id="post-form" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
        {{formPost}}
    </div>
</form>

就是這樣,並在同一個表單中添加一個提交按鈕,您現在可以編輯與此{{formPost}}一起傳遞的post實例。 在您認為需要更改以適應您想做的事情的任何地方結合您的邏輯。

我絕不是說所有這些代碼都處於工作狀態,但顯示它只是為了說明流程和工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM