2014-02-12 7 views
6

Это мой первый реальный идти с Django (1.6), и я не был в состоянии понять это:Джанго CreateView ModelForm выпадающего поля QuerySet фильтр

Я пытаюсь ограничить выпадающий список на 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() 

Мой forms.py:

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' 

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

ответ

5

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

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

Спасибо! Это заставило меня пройти эту ошибку, но теперь моя форма не создается. Сначала мнение жаловалось, что имя шаблона не было определено, и после того, как я его указал, он останавливается при рендеринге, говоря, что атрибуты формы не существуют. Я буду продолжать копать, пока не узнаю, насколько глубока эта дыра :) – dennyreiter

+2

Я переместил запрос в def get_form() моего CreateView (который я хотел изначально), и теперь он работает. Большое спасибо за Вашу помощь. – dennyreiter

1

Вы были близки, но почему-то смешаны с тем, что выглядит как синтаксис SQLAlchemy.

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

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

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

Смежные вопросы