如何在 Django 中创建带有下拉列表的提交表单?

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

我刚开始使用 Django,我在表单和删除列表方面遇到了一些问题。

我有一个具有两个属性的模型,我想在下拉列表中显示一个属性(这个属性不可更改),另一个在文本字段中显示(这个属性可以更改)。另外,我有一个提交按钮,所以我想更改文本字段中的第二个属性并按下按钮。我怎样才能做到这一点?一些例子是什么?

当您开始使用 Django 工作时,您可能知道也可能不知道 Django 如何处理表单。

在 Django 中,可以通过两种方式处理表单:

  1. 用户创建和管理的表单(无任何表单class)
  2. Class-管理表单(连接到 Django 模型)

Documentation form 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 %},关于它你可以阅读更多关于 here and about how it works and prevents cross-site request forgery 的内容。当您使用任何 post 请求和数据向 Django 服务器发出请求时,将需要此令牌。

在此订阅表格中,您会看到 <input>name="sub_email"。请注意这一点,因为我们将使用它在服务器上获取此值,因为这是 key 到它的 value,并且然后是一个简单的 提交按钮.

当您在页面上按 提交 时,假设 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 class 的表单。


当您的输入很少时,这些视图会有点麻烦,但是当您必须处理大量输入时,它们对可管理性有很大帮助。

You will request these Class Based Forms as in your question you are trying to send an instance of a model from your Models.py to a form to user.

我有一个可用于此示例的帖子模型:

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,对于位置,您 让用户 select 预先 select 的国家之一,并为您 post.

现在我们必须为此创建一个表单。基于 class 的表单是在 Forms.py 中创建的。如果你没有 forms.py 那么你可以沿着 models.py[ 创建一个=127=].

现在对于表单,我想编辑一些现有数据,因为您说其中一个属性(字段)是固定的,另一个是可编辑的,但是您从模型中获取值。

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 实例。在您认为需要更改的任何地方结合您的逻辑以适应您想要做的事情。

我绝不是说所有这些代码都处于工作状态,它只是为了说明流程和工作而显示的。