2014-02-12 74 views
6

這是我第一次真正去使用Django(1.6),我一直沒能想出解決辦法:Django的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) 

和views.py我CreateView的:

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

謝謝!這讓我失去了那個錯誤,但現在我的表單似乎並沒有被創建。首先,視圖抱怨沒有template_name被定義,並且在我指定它之後,它會停止渲染,表示表單屬性不存在。我會繼續挖掘,直到我發現這個洞有多深:) – dennyreiter

+2

我將查詢移動到了我的CreateView(我最初想要的)的def get_form()中,現在它似乎工作。非常感謝你的幫助。 – dennyreiter

1

你很親密,但由於某種原因混雜在看起來像SQLAlchemy語法的東西中。

此外,通過任意指定的數字(PK)過濾您的查詢集的想法是荒謬的。

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

會更有意義,如果只有您的狀態名稱被標記爲unique=True