Django页面跳转添加关联表数据及表单下拉选项重复问题
问题1:跳转表单页自动填充关联游戏且不报错
错误原因
你跳转链接传递的参数是Game表的主键ID,但视图中错误使用该ID查询Event表的主键,且你的需求是新增事件而非修改已存在的事件,不需要提前查询Event实例。
解决方法
修改add_event视图逻辑,先根据传入的game_id查询对应的游戏对象,再给表单初始化project字段的默认值即可:
from django.shortcuts import redirect, get_object_or_404 def add_event(request, game_id): # 查询对应游戏对象,不存在则直接返回404 target_game = get_object_or_404(Game, pk=game_id) if request.method == "POST": form = addEventForm(request.POST) if form.is_valid(): # 提交时自动绑定关联游戏,避免用户修改 new_event = form.save(commit=False) new_event.project = target_game new_event.save() # 替换为你需要跳转的后续页面路由 return redirect("game-list") else: # 表单初始化时自动填充project字段为当前游戏 form = addEventForm(initial={"project": target_game}) return render(request, "pages/add_event.html", {"form": form, "target_game": target_game})
如果不希望用户修改自动填充的关联游戏,可以在addEventForm中将project字段设置为disabled或者HiddenInput类型。
问题2:下拉框项目名选项去重
错误原因
你当前模板的遍历逻辑错误:event.game.project_name是单个字符串,遍历该值只会拆分输出单个字符;且你从Event表关联查询project值,同一个游戏关联多个事件就会出现重复选项。
解决方法
Game模型的project_name已经设置了unique=True约束,本身不存在重复值,直接遍历所有Game对象即可:
- 首先在表单页的视图中,将所有游戏对象传入模板上下文:
# 以add_event视图为例,其他视图同理 def add_event(request, game_id=None): # ...原有逻辑... all_games = Game.objects.all() return render(request, "pages/add_event.html", {"form": form, "all_games": all_games})
- 修改模板下拉框代码:
<select class="form-control" name="choices-single-no-sorting" id="project-tier-entry-level"> <option value="" disabled selected hidden>Please Choose...</option> {% for game in all_games %} <option value="{{ game.project_name }}">{{ game.project_name }}</option> {% endfor %} </select>
如果确实需要从Event表查询关联的项目名,可使用distinct()去重,查询语句为Event.objects.values_list("project", flat=True).distinct()。
内容的提问来源于stack exchange,提问作者JacksWastedLife
相关产品推荐
相关产品推荐

