2013-11-22 63 views
0

此問題與Set model field choices attribute at run time? 類似但是,我的問題是我想在類級別更改選項屬性的默認值。更改模型字段的選擇屬性

我有這個

class Project(models.Model): 

    name = models.CharField(...) 

    @staticmethod 
    def getAllProjectsTuple(): 
     return tuple([(p.id, p.name) for p in Project.objects.all()]) 

class Record(models.Model): 

     project = models.ForeignKey(
          Project, 
          verbose_name='Project', 
          help_text='Project name', 
          blank=True, null=True, 
          on_delete=models.SET_NULL, 
          choices = Project.getAllProjectsTuple(), 

class RecordForm(ModelForm): 

     class Meta: 
       model = Record 

我的問題是,所有的RecordForm將使用在模型中的模塊導入時的可用選項的TypedChoiceField創建。但是,用戶可以創建更多的項目,這些項目將永遠不會出現在RecordForm中;相同的刪除。

我試圖直接與RecordForm的INIT篡改:

self.fields['project']._choices = [('', '---------'),] + [(p.id, p.name) for p in Project.objects.all()] 

或與INIT記錄的

self._meta.get_field('project')._choices = Project.getAllProjectsTuple() 

,但似乎沒有任何工作。

感謝您的幫助。

+1

爲什麼你在使用選項而不是僅僅使用標準的'ModelSelectWidget'和queryset?默認行爲與您的'getAllProjectsTuple'行爲相同。 –

+1

只是'選擇= Project.objects.values_list('id','name')'? – karthikr

+0

@Peter,這實際上解決了它。我不知道我是如何理解的。如果我不覆蓋它,那麼是否會一直重新評估選項的Django魔術?謝謝 ! – Ptah

回答

0

我想通了,:

self.fields['project'].choices = [('', '----------')] + [(p.id, p.name) for p in Project.objects.all()] 

INIT的RecordForm也做的伎倆。但@Peter DeGlopper在評論中的回答更好。