问题描述
美好的一天,
我想问一下,是否可以确定对 models.ForeignKey 字段的额外依赖?例如...
models.py
class Object_A(models.Model):
name = models.Charfield(max_length=50,null=False,blank=False,unique=True)
date_created = models.DateTimeField(auto_Now_add=True)
class Object_B(models.Model):
name = models.Charfield(max_length=50,unique=True)
object_a = models.ForeignKey(Object_A,on_delete=models.CASCADE)
date_created = models.DateTimeField(auto_Now_add=True)
class Object_C(models.Model):
name = models.Charfield(max_length=50,on_delete=models.CASCADE)
object_b = models.ForeignKey(Object_B,on_delete=models.CASCADE)
date_created = models.DateTimeField(auto_Now_add=True)
forms.py
class Create_Object_C_Form(ModelForm):
class Meta:
model = Object_C
exclude = [
'object_a','date_created',]
我正在尝试做什么...
如您所见,我排除了 object_a,因为此时在我的应用程序中使用表单的地方,用户不必选择 object_a。他自己的脚步已经预料到了这个选择! object_b 也一样——或者至少几乎一样——是否可以只显示与同一个 object_a 相关的选项?
希望我能以可以理解的方式解释我的问题,有人可以提供帮助或有想法!?祝您有美好的一天!
解决方法
您需要覆盖您的表单 __init__
方法并接受一个关键字参数来指示要使用哪个 Object_A
实例:
class Create_Object_C_Form(ModelForm):
class Meta:
model = Object_C
exclude = [
'object_a','date_created',]
def __init__(self,*args,**kwargs):
object_a = kwargs.pop('object_a') # get ObjectA from kwargs
super().__init__(*args,**kwargs)
self.fields['object_b'].queryset = object_a.object_b_set.all()
现在,当您创建此表单时,您会将要使用的 ObjectA
实例传递给它:
Create_Object_C_Form(object_a=object_a)
注意:不要在类名中使用 _
,这是违反约定的。尤其不要在 Django 中使用它们,这会导致查找混乱。