我创建了以下模型。许多帐户属于一台计算机。
class Computer(models.Model):
name = models.CharField(max_length=256)
def __str__(self):
return str(self.name)
class Accounts(models.Model):
computer = models.ForeignKey(Computer, on_delete=models.CASCADE, related_name='related_name_accounts')
username = models.CharField(max_length=10)
def __str__(self):
return str(self.username)
我现在要创建一个表单,在其中我可以从属于计算机的所有用户的下拉列表中选择一个用户
class ComputerForm(forms.ModelForm):
class Meta:
model = Computer
exclude = ['name',]
def __init__(self, *args, **kwargs):
super(ComputerForm, self).__init__(*args, **kwargs)
self.fields['user']=forms.ModelChoiceField(queryset=Computer.related_name_accounts.all())
但是我得到一个错误
'ReverseManyToOneDescriptor'对象没有属性'all'
如何调整__init__
中的查询集以显示计算机的所有用户?
编辑:
>>> x = Computer.objects.filter(pk=3).get()
>>> x.related_name_accounts.all()
我将需要以某种方式将动态pk传递给ModelForm吗?
答案 0 :(得分:0)
您的问题是您在C
中使用了大写字母Computer.related_name_accounts.all()
。这没有道理,因为Computer
模型没有相关字段-它是 instances 。
这行代码将起作用:
computer = Computer.objects.get(id=1)
computer.related_name_accounts.all()
但是问题是,我不确定您所说的...of all users that belong to a Computer
是什么意思,因为您在ForeignKey
和{{之间没有OneToOne
或User
关系1}}。
答案 1 :(得分:0)
您可以将模型的实例传递给这样的表单:
x = Computer.objects.get(pk=3)
form = ComputerForm(instace=x)
并通过self.instance
形式的方法来访问它:
class ComputerForm(forms.ModelForm):
class Meta:
model = Computer
exclude = ['name',]
def __init__(self, *args, **kwargs):
super(ComputerForm, self).__init__(*args, **kwargs)
self.fields['user']=forms.ModelChoiceField(
queryset=self.instance.related_name_accounts.all()
)