Я использую 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'})
Я продолжаю получать AttributeError в RankingForm от
"позиция = формы.ModelMultipleChoiceField(queryset=Application.positions.all())"
когда я пишу
class Application(models.Model):
...
def __str__(self):
return str(self.positions.all())
он отображается в django-admin как QuerySet (который работает для форм.ModelMultipleChoiceField()), но запись
class Application(models.Model):
...
def __str__(self):
return str(Application.positions.all())
дает мне ту же ошибку: объект «ManyToManyDescriptor» не имеет атрибута «все»
Пишу
class RankingForm(forms.ModelForm):
...
position = forms.ModelMultipleChoiceField(queryset=Position.objects.all())
работает, но это не то, что я хочу отображать в поле.
Я хочу создать ModelMultipleChoiceField() со всеми позициями из определенного приложения, но эта ошибка продолжает мешать. Кажется, что просто ссылка на модель не работает, но ссылка на себя работает ?? Любая помощь приветствуется! :)
Кстати, я не нашел хорошей документации по этой проблеме, но это кажется кодом для related_descriptors.py, где находится ManyToManyDescriptor
self.positions.all()
, а неApplication.positions.all()
self
ссылки на экземпляр приложения. Для формы набор запросов должен оцениваться при инициализации не на уровне класса, т.е.position = forms.ModelMultipleChoiceField(queryset=Positions.objects.none())
- person jackotonye   schedule 26.03.2018