2010-03-02 93 views
3

我想在我的一個表單中填充兩個外鍵字段。代碼的相關位如下:初始化外鍵丟失

if request.method == 'POST': 
    form = IssuesForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     form.save() 
else: 
    form = IssuesForm(initial={'vehicle': stock_number, 'addedBy': request.user, }) 

vehicle指向Vehicle類。 addedBy是包含當前登錄的用戶。

然而,下拉菜單不被初始化,因爲我想......我還是要選擇車輛和用戶。從這我有兩個問題:

  1. 可能是什麼問題?
  2. 什麼是使這些表單爲只讀的最佳方式?

編輯1IssueForm類看起來像這樣至今:

class Issues(models.Model): 
    vehicle = models.ForeignKey(Vehicle) 
    description = models.CharField('Issue Description', max_length=30,) 
    type = models.CharField(max_length=10, default='Other', choices=ISSUE_CHOICES) 
    status = models.CharField(max_length=12, default='Pending', 
    choices=ISSUE_STATUS_CHOICES) 
    priority = models.IntegerField(default='8', editable=False) 
    addedBy = models.ForeignKey(User, related_name='added_by') 
    assignedTo = models.CharField(max_length=30, default='Unassigned') 
    dateTimeAdded = models.DateTimeField('Added On', default=datetime.today, 
    editable=False) 
    def __unicode__(self):  
    return self.description 

Form類

class IssuesForm(ModelForm): 
    class Meta: 
    model = Issues 
    exclude = ('assignedTo') 
+0

你能不能展示你的'IssuesForm'類? – 2010-03-02 18:15:07

+0

@ Ben我已添加類 – Stephen 2010-03-02 18:34:41

+0

您應該嘗試傳入其他字段之一的初始數據,例如描述。如果人口稠密,我會想象這個問題源於車輛的PK,而不是車輛物體本身。 – Adam 2010-03-02 18:37:21

回答

1

關於第二個問題,你想使addedBy場讀-只要?如果是這樣,請不要將它添加到表單中(如果將其呈現給用戶,它將永遠不會是隻讀的,例如Firebug)。您可以將其填充到保存方法中。

if request.method == 'POST': 
    form = IssuesForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     issue = form.save(commit=False) 
     issue.addedBy = request.user 
     # any other read only data goes here 
     issue.save() 
else: 
    form = IssuesForm(initial={'vehicle': stock_number}) # this is related to your first question, which I'm not sure about until seeing the form code 
+0

我的想法是,「車輛」:stock_number將initalize車輛外鍵進入 – Stephen 2010-03-02 18:35:48

+0

太多的檢查request.method,如果你用(request.POST或None)初始化表單,然後你需要做的就是檢查is_valid(),因爲unbound表單(在POST爲None的情況下)沒有錯誤 – 2010-03-02 23:23:26

+0

@ Dmitry:我剛纔看到了很多檢查。 ..我正在從一箇舊的應用程序,我已經做了相同的功能代碼... thnx通知 – Stephen 2010-03-03 08:10:16

0

爲只讀形式:在你的窗體類,覆蓋__init__method禁用HTML字段:

def __init__(self, *args, **kwargs): 
    super(IssuesForm, self).__init__(*args, **kwargs) 
    for key in self.fields.keys(): 
     self.fields[key].widget.attrs = {'disabled': 'disabled'} 

確保你也別聽POST請求,如果是這樣,不要不保存表格。 您可以進一步自定義__init__方法以獲取一些參數,並在超級方法被調用後將字段設置爲這些值。