我正在使用Django 2.0.2,Python 3.6.4和PyCharm 2017.3.3
模型:(在models.py中)
class Position(models.Model):
title = models.CharField(max_length=50)
gang = models.ForeignKey(Gang, on_delete=models.CASCADE)
description = models.TextField(max_length=20000)
def __str__(self):
return str(self.title) + ', ' + str(self.gang)
class Application(models.Model):
positions = models.ManyToManyField(Position)
applicant = models.ForeignKey(User, on_delete=models.CASCADE)
class Ranking(models.Model):
position = models.ForeignKey(Position, on_delete=models.CASCADE)
applicant = models.ForeignKey(User, on_delete=models.CASCADE)
rank = models.IntegerField(default=3,validators=[
MaxValueValidator(3),
MinValueValidator(1)
])
表格:(在forms.py中)
class RankingForm(forms.ModelForm):
rank = forms.IntegerField(max_value=3, min_value=1)
position = forms.ModelMultipleChoiceField(queryset=Application.positions.all())
class Meta:
model = Ranking
exclude = ['applicant']
fields = ('rank', 'position')
def __init__(self, *args, **kwargs):
super(RankingForm, self).__init__(*args, **kwargs)
self.fields['rank'].widget.attrs.update({'class': 'form-control'})
我一直从
获取RankingForm中的AttributeError“position = forms.ModelMultipleChoiceField(queryset = Application.positions.all())”
我写的时候
class Application(models.Model):
...
def __str__(self):
return str(self.positions.all())
它在django-admin中显示为QuerySet(适用于forms.ModelMultipleChoiceField()),但写作
class Application(models.Model):
...
def __str__(self):
return str(Application.positions.all())
给了我同样的错误:'ManyToManyDescriptor'对象没有属性'all'
书写
class RankingForm(forms.ModelForm):
...
position = forms.ModelMultipleChoiceField(queryset=Position.objects.all())
有效,但这不是我想要显示的字段。
我想创建一个ModelMultipleChoiceField(),其中包含来自特定应用程序的所有位置,但是这个错误一直在阻碍。似乎只是引用一个模型不起作用,但引用自己做??任何帮助是极大的赞赏! :)
顺便说一下,我没有找到关于这个问题的任何好的文档,但this似乎是ManyToManyDescriptor所在的related_descriptors.py的代码
答案 0 :(得分:1)
使用作为类的初始化实例的实例来评估关系。
应用程序的一个实例。
<form id="15" method="post" action="/open a new page" target="_blank">
<select name="docToSeize" style="width:150px" class="form1">
<option value="11">RAP </option>
<option value="12">CAD </option>
<option value="18">GGO</option>
<option value="1A">HYU</option>
</select>
</form>
初始化后更改表单查询集。
application = Application.objects.first()
application.positions.all()
答案 1 :(得分:0)
您可以使用ModelForm
属性访问instance
对象正在使用的模型的当前实例。然后,您可以使用它在__init__
:
class RankingForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['rank'].widget.attrs.update({'class': 'form-control'})
self.fields['position'].queryset = self.instance.positions.all()