如何在 Django 中创建带有下拉列表的提交表单?
How can I create a submit form in Django with a dropping down list?
我刚开始使用 Django,我在表单和删除列表方面遇到了一些问题。
我有一个具有两个属性的模型,我想在下拉列表中显示一个属性(这个属性不可更改),另一个在文本字段中显示(这个属性可以更改)。另外,我有一个提交按钮,所以我想更改文本字段中的第二个属性并按下按钮。我怎样才能做到这一点?一些例子是什么?
当您开始使用 Django 工作时,您可能知道也可能不知道 Django 如何处理表单。
在 Django 中,可以通过两种方式处理表单:
- 用户创建和管理的表单(无任何表单class)
- 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
实例。在您认为需要更改的任何地方结合您的逻辑以适应您想要做的事情。
我绝不是说所有这些代码都处于工作状态,它只是为了说明流程和工作而显示的。
我刚开始使用 Django,我在表单和删除列表方面遇到了一些问题。
我有一个具有两个属性的模型,我想在下拉列表中显示一个属性(这个属性不可更改),另一个在文本字段中显示(这个属性可以更改)。另外,我有一个提交按钮,所以我想更改文本字段中的第二个属性并按下按钮。我怎样才能做到这一点?一些例子是什么?
当您开始使用 Django 工作时,您可能知道也可能不知道 Django 如何处理表单。
在 Django 中,可以通过两种方式处理表单:
- 用户创建和管理的表单(无任何表单class)
- 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
实例。在您认为需要更改的任何地方结合您的逻辑以适应您想要做的事情。
我绝不是说所有这些代码都处于工作状态,它只是为了说明流程和工作而显示的。