基于URL中的slug自动填充Django外键字段的实现需求
基于URL中的Slug自动填充Post的Game外键字段
实现方案:
1. 修改CreatePost视图
从URL参数中获取游戏slug,自动匹配对应的Game对象并赋值给Post实例,同时移除表单中的手动选择项:
修改posts/app/views.py:
from django.shortcuts import get_object_or_404 class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView): fields = ('title','message') # 移除game字段,不再让用户手动选择 model = models.Post select_related = ('user', 'game') def form_valid(self, form): # 从URL中获取slug,查询对应Game(不存在则返回404) game = get_object_or_404(models.Game, slug=self.kwargs['slug']) # 为Post实例设置当前用户和匹配到的Game form.instance.user = self.request.user form.instance.game = game return super().form_valid(form)
2. 确认URL配置
你的posts/app/urls.py中已经正确配置了带slug参数的路由:
urlpatterns = [ path('', views.PostList.as_view(), name="all"), path("new/<slug>/", views.CreatePost.as_view(), name="create"), ]
无需额外修改,该路由会将URL中的slug传递到视图的kwargs中。
3. 额外验证(可选)
Post模型中的get_absolute_url方法已经使用self.game.slug生成跳转链接,只要game字段被正确填充,该方法就能正常工作,无需调整。
内容的提问来源于stack exchange,提问作者maze
相关产品推荐
相关产品推荐

