Фильтр набора запросов выпадающего поля Django CreateView ModelForm

Это мой первый настоящий опыт с Django (1.6), и я не смог понять это:

Я пытаюсь ограничить раскрывающийся список CreateView, чтобы показать только проекты, которые имеют активный статус (2) в модели проекта:

class ProjectStatus(models.Model):
    name = models.CharField(max_length=8)

class Project(models.Model):
    name = models.CharField(max_length=30)
    status = models.ForeignKey(ProjectStatus)

class WorkLog(models.Model):
    project = models.ForeignKey(Project)
    author = models.ForeignKey(User)
    log_date = models.DateField( default=datetime.date.today)
    accomplishments = models.TextField()

Мои формы.

class WorklogCreateForm(ModelForm):

class Meta:
    model = WorkLog
    fields = [ 'project', 'log_date', 'accomplishments' ]

def __init__(self, *args, **kwargs):
    super(WorklogCreateForm, self).__init__(self, *args, **kwargs)
    self.fields['project'].queryset = Project.objects.filter(Project.status == 2)

и мой CreateView из views.py:

class WorklogCreate(CreateView):
    form_class = WorklogCreateForm
    success_url = reverse_lazy('dashboard')

Но я получаю ошибку:

TypeError at /log/add/
'bool' object has no attribute '__getitem__'

Если я изменю свой фильтр на (Project.status.id == 2) Я вместо этого получаю:

AttributeError at /log/add/
'ReverseSingleRelatedObjectDescriptor' object has no attribute 'id'

Я думаю, что я близко, но не совсем понимаю, что мне нужно. Есть идеи? Благодарю.

2 ответа

Решение

Попробуйте отфильтровать, как это.

 self.fields['project'].queryset = Project.objects.filter(status_id=2)

Вы были близки, но по какой-то причине смешались в том, что похоже на синтаксис SQLAlchemy.

Кроме того, идея фильтрации вашего набора запросов по произвольно назначенному номеру (PK) абсурдна.

self.fields['project'].queryset = Project.objects.filter(status__name="foo")

было бы гораздо больше смысла, если бы только ваше имя статуса были отмечены unique=True,

Другие вопросы по тегам