You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django CreateView的get_context_data中通过pk_url_kwargs获取外键类型字段

Django CreateView获取外键关联模型字段的解决方案

首先修正原代码中的几个错误:Mymodel2CreateView需继承自django.views.generic.edit.CreateView而非models.Model;pk_url_kwarg参数拼写有误(原代码多了个s);同时补充Django模型字段的必填参数(如CharField的max_length、外键的on_delete)。

以下是完整的实现代码:

from django.views.generic.edit import CreateView

class Mymodel1(models.Model):
    name = models.CharField(max_length=100)
    type = models.CharField(choices=SomeTypes.choices(), max_length=50)

class MyModel2(models.Model):
    name = models.CharField(max_length=100)
    cas = models.ForeignKey(Mymodel1, on_delete=models.CASCADE)

class Mymodel2CreateView(CreateView):
    model = MyModel2
    pk_url_kwarg = 'cas_id'
    fields = ['name']  # 指定CreateView需处理的字段

    def get_context_data(self, **kwargs):
        # 先获取父类的基础上下文(保留CreateView默认的表单等数据)
        context = super().get_context_data(**kwargs)
        # 从URL参数中取出cas_id,获取对应的Mymodel1实例
        cas_id = self.kwargs.get('cas_id')
        mymodel1_instance = Mymodel1.objects.get(pk=cas_id)
        # 获取type字段的数据库存储值
        context['mymodel1_type'] = mymodel1_instance.type
        # 若需要获取choices对应的友好显示文本,使用Django自动生成的方法
        # context['mymodel1_type_display'] = mymodel1_instance.get_type_display()
        return context

核心说明

  • 必须先调用父类的get_context_data,避免丢失CreateView默认的上下文数据(如表单对象)
  • 通过self.kwargs可直接获取URL中定义的cas_id参数
  • 针对choices类型字段,get_type_display()方法能返回选项的友好显示文本,而非数据库中存储的原始键值

内容的提问来源于stack exchange,提问作者jimmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:55:33