2012-03-31 73 views
0

我在一個項目中的以下模型:django模型數據表;試圖保存模型之外從列表中選擇項目

class CarAssignment(models.Model): 
    leg = models.ForeignKey(Leg, null=True, blank=True) 
    driver = models.ForeignKey(Driver, null=True, blank=True) 
    riders = models.ManyToManyField(Rider, null=True, blank=True) 

我想創建一個網頁,一個表,一個管理員用戶可以編輯驅動器和爲特定組中所有車輛分配的車手物品。我無法使用formset,因爲我還需要添加來自其他模型的數據,並且每個列表中的選項都來自不同的騎手和驅動程序子集,屬於特定組。 Driver是一個選擇列表,Riders是一個多選列表。

我已成功構建頁面和表來表示數據,並具有正確工作的下拉列表。但是,我無法弄清楚如何保存項目。這是一個特定的問題場景:

對於表1中的行1(表示CarAssignment對象#1),我從選擇下拉列表中選擇一個新的驅動程序。我在HTML指定自定義名稱標籤來識別它們,如下所示:

<option selected name="select.driver.{{ car_assignment.id }}">{{ driver }}</option> 
視圖

然後,我想看看它是否匹配任何東西,如下:

 for car_assignment in CarAssignment.objects.filter(leg__in=legs): 
      driver_tag = "select.driver." + str(car_assignment.id) 
      if driver_tag in request.POST: 
       car_assignment.driver = driver 
       car_assignment.save() 

問題是,當它找到匹配的驅動標籤時,它返回的是名字和姓氏的字符串。我無法執行car_assignment.driver =驅動程序,因爲它試圖將驅動程序對象等同於字符串。

我不知道如何做到這一點。我想我可以解析出第一個和最後一個名字,並嘗試將它們與Driver模型進行匹配,以獲得我需要的Driver對象,但這似乎效率低下並且可能會出錯。

任何幫助表示讚賞(我是一個編程和Django新手)。謝謝。

回答

1

我不知道在哪裏你那driver場是從哪裏來的,但如果它是一個字符串,然後你可以做另一個查詢來獲取驅動程序對象,像這樣:

for car_assignment in CarAssignment.objects.filter(leg__in=legs): 
    driver_tag = "select.driver." + str(car_assignment.id) 
    if driver_tag in request.POST: 
     # Get the driver object 
     driver = Driver.objects.filter(name=driver_name)[0] 

     car_assignment.driver = driver 
     car_assignment.save() 

我還高建議您閱讀Django教程Working with forms。您在視圖中編寫的邏輯應該移至表單對象。然後您的視圖可以實例化表單並傳遞發佈數據。然後可以驗證表單並處理保存新對象。這是做到這一點的最佳方式。

您查看更新的流程將被簡化爲這樣的事:

def my_view(request): 
    if request.method == 'POST': 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      form.save() 

      # Do something here like redirect the user 
      # to acknowledge that the form was submitted successfully. 
    else: 
     form = MyForm() 

    return render_to_response('form.html', { 
     'form': form, 
    }) 

通過形式傳遞到您的模板可以生成表格做什麼,但這樣的:

{{ form.as_ul }} 
相關問題