Django创建群组时用户选择的分类无法存入数据库如何解决
问题原因
导致分类数据无法写入数据库的核心问题有两个:
- 视图函数中没有读取前端传递的分类参数,也没有将分类实例绑定到新建的
GroupEx对象中 - 代码存在变量名冲突的隐含问题,会额外导致群名称字段存储异常
修复步骤
1. 修正视图函数的POST处理逻辑
修改后的视图代码如下:
def create_group(request): context = {} user = request.user groups = GroupEx.objects.all() friend_list = FriendList.objects.get(user=request.user) friends = friend_list.friends.all() if request.method == 'POST': # 修正变量名冲突,避免把Group对象赋值给群名字符串变量 group_name_input = request.POST['group_name'] # 读取前端传递的分类ID category_id = request.POST.get('categories') cover = request.FILES.get('cover',False) # 校验所选分类是否存在 try: category = Category.objects.get(id=category_id) except Category.DoesNotExist: context['error_msg'] = '所选分类无效,请重新选择' return render(request, '你创建群组的模板文件名.html', context) group_obj,created = Group.objects.get_or_create(name=group_name_input) user_obj = Account.objects.get(username=request.user.username) # 实例化时新增categories参数绑定分类 group_data = GroupEx( admin=user_obj, group_name=group_name_input, group=group_obj, cover=cover, categories=category ) group_data.save() return redirect('group:groups') # 优化:把预创建的分类列表传到前端动态渲染,不用手动写死option context['groups'] = groups context['categories'] = Category.objects.all()
2. 可选优化(推荐):前端分类选项动态渲染
把原来写死的select选项改成动态遍历后端传递的分类列表,后续新增预创建分类时无需修改前端代码:
<div> <label for="id_categories" class="font-semibold text-base"> Group Category </label> <select id="id_categories" name="categories" class="shadow-none selectpicker with-border"> {% for cat in categories %} <option value="{{ cat.id }}">{{ cat.name }}</option> {% endfor %} </select> </div>
3. 注意事项
你当前前端写死的option里有value="0"的「Other」选项,如果你的Category表中没有ID为0的记录,会触发分类不存在的报错,建议要么把这个选项的value改成数据库中实际存在的「其他」分类ID,要么提前在数据库中预创建ID为0的Other分类。
内容的提问来源于stack exchange,提问作者Godda
相关产品推荐
相关产品推荐

