Django 在 URL 中访问 PK/Object

Posted

技术标签:

【中文标题】Django 在 URL 中访问 PK/Object【英文标题】:Django access PK/Object in URL 【发布时间】:2019-08-26 11:44:26 【问题描述】:

我有两个课程 - 事件和回合。 Round 对 event 有外键约束,所以 round 绑定到 event。

现在要创建一个回合,我有以下路线

<slug:slug_event>/new/

进入一轮

<slug:slug_event>/<int:pk_round>/

要保存一轮,我需要声明一个事件。所以在我的 round/views.py 我有

fields = [..., 'event']

我可以选择该回合将附加到的事件。 但我不想有那个事件字段,因为事件已经在 URL 中给出。 所以我想要类似的东西

class RoundCreateView(CreateView):
    model = Round
    pk_url_kwarg = 'pk_round'
    fields = [...]

    def form_valid(self, form):
        form.instance.event = self.request.event #obviously this dosn't work
        return super().form_valid(form)

所以我不需要“两次”指定事件。

【问题讨论】:

【参考方案1】:

您可以使用 URL 中的 slug 从数据库中获取事件:

def form_valid(self, form):
    event = get_object_or_404(Event, slug=self.kwargs['slug_event'])
    form.instance.event = event
    return super().form_valid(form)

现在您可以从表单的字段中删除“事件”。

请注意,如果事件不存在,get_object_or_404 将显示 404 页面。您可能还想对 GET 请求执行 get_object_or_404,这样用户就不会填写无效 slug 的表单,然后收到 404 错误。

【讨论】:

以上是关于Django 在 URL 中访问 PK/Object的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HTML 模板中访问 Django URL 参数 /<thing>/?

AngularJS + Django:URL 刷新或直接访问未正确加载

防止用户直接访问 django 中的重定向 URL

我可以在 django 模板上下文处理器中访问 url kwargs 吗?

Django之反向生成url

在不使用上下文处理器的情况下访问 django 1.7 模板中的 URL 参数