为什么我不能完全获取 python 字典中的列表值(Django 请求)?



我有一个表单里面是一个带有选项的选择标签,它看起来像这样:

<form method="POST">
{% csrf_token %}
<div class="row">
<div class="col-sm-3">
<h4 class="mb-0 mt-2">Title:</h4>
</div>
<div class="col-sm-9">
<input type="text" name="title" class="form-control" placeholder="Blogpost Title">
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h4 class="mb-0 mt-2">Tags:</h4>
</div>
<div class="col-sm-9">
<select class="form-select" name="tags" multiple aria-label="multiple select example" required>
{% for tag in tags %}
<option value="{{tag.name}}">{{tag.name}}</option>
{% endfor %}
</select>
</div>
</div>
<hr>

<div class="row">
<div class="col-sm-3">
<h4 class="mb-0 mt-2">Description:</h4>
</div>
<div class="col-sm-9">
<textarea name="desc" class="form-control" id="exampleFormControlTextarea1" rows="4" placeholder="Blogpost Description (HTML supported)"></textarea>
</div>
</div>
<hr>
<div class="text-center">
<button type="submit" class="btn btn-primary">Create</button>
</div>
</form>

这是我的视图,我在这里处理它:

def create_blogpost(request, id):
user = User.objects.get(id=id)
tags = Tag.objects.all()
if request.method == 'POST':
title = request.POST['title']
blogpost_tags = request.POST['tags']
desc = request.POST['desc']
# BlogPost.objects.create(
#     title=title,
#     profile=user,
#     tags=tags,
#     desc=desc
# )
else:
pass
context = {
'user': user,
'tags': tags
}
return render(request, 'main/create_blogpost.html', context)

当我打印请求时。POST它看起来像这样:

request.POST <QueryDict: {'csrfmiddlewaretoken': ['TOKEN'], 'title': ['blogpost title'], 'tags': ['Python', 'C++'], 'desc': ['']}>

这里我选择了两个标签:Python和c++,但是当我打印变量blogpost_tags时,它只显示列表的最后一个元素,在本例中是c++。

为什么会这样?我做错了什么吗?

实际上这是一个功能,你的代码没有任何问题,阅读这个

这背后的原因是API方法应该一致地返回字符串或列表,但绝不能同时返回两者。在web应用程序中,常见的情况是表单键与单个值相关联,所以这就是[]语法的作用。Getlist()是为你想对一个值多次使用一个键的情况(比如你的情况)而存在的。

你可以像这样得到列表:

blogpost_tags = request.POST.getlist('tags')

我希望这对你有帮助:)

最新更新