在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
相关产品推荐
相关产品推荐

