2015-12-10 21 views
0

我和朋友們通過一個笨拙的電子表格來玩體育採摘遊戲,我決定通過將遊戲作爲一個web應用程序來學習Django。我經歷了Django教程,並且一直在研究在數據庫,視圖和模板之間傳遞數據的基礎知識。將Django model + modelform作爲一個單元組合使用

我試圖從一個模型旁邊顯示不同模型表單的信息,然後根據顯示的模型處理將該表單保存到數據庫。下面是我對我的模型:

class Sheet(models.Model): 
user = models.ForeignKey(User) 
... other stuff 

class Game(models.Model): 
home_team = models.CharField(max_length=100, default='---') 
away_team = models.CharField(max_length=100, default='---') 
... other stuff 

class Pick(models.Model): 
sheet = models.ForeignKey(Sheet) 
game = models.ForeignKey(Game) 
... other stuff 

正如你所看到的,精選兼具片和遊戲 - 這樣一個用戶表可以有多個精選(由於遊戲的格式),並且每場比賽可以有多個選擇(因爲多個用戶可能會選擇任何給定的遊戲)。

我的目的是用PickForm顯示遊戲信息,以便用戶可以根據顯示的信息進行挑選。然後在POST上,選擇適當的外鍵,以正確的遊戲。我嘗試的權利,因此下面的靜態對象ID:

class GameDetail(DetailView): 
model = Game 
template_name = 'app/games.html' 
context_object_name = 'game_detail' 

def get_object(self): 
    game = get_object_or_404(Game, id=5) 
    return game 

def get_context_data(self, **kwargs): 
    context = super().get_context_data(**kwargs) 
    context['pickform'] = PickForm() 
    return context 

def post(request): 
    form = PickForm(request.POST) 
    if form.is_valid(): 
     pick = Pick(sheet = form.cleaned_data['sheet'], 
        game = form.cleaned_data['game'], 
        amount = form.cleaned_data['amount'], 
        pick_type = form.cleaned_data['pick_type'], 
        pick_team = form.cleaned_data['pick_team'] 
        ) 
     pick.save() 
     return HttpResponseRedirect('/games/') 

什麼我不知道的是,我應該通過創建結合了遊戲的PickForm一個單獨的窗體類做到這一點?或者將它們動態綁定在一起更有意義?一種選擇我期待在後者使用Form.initial能力有以下變化get_context_data:

context['pickform'] = PickForm(initial={'game':self.game}) 

這樣的錯誤,當我嘗試加載頁面

AttributeError at /games 
'GameDetail' object has no attribute 'game' 

在get_context_data (),get_object()還沒有運行?我認爲這是第一次,然後是get_context_data()。

我本來可以用完全錯誤的方式去解決這個問題,所以我會非常感謝關於這個問題的任何建議,或者我如何構建整個事情。

編輯:我如果它被定義爲GameDetail的頂部場才意識到self.game可能僅會工作,所以我嘗試這樣做:

context['pickform'] = PickForm(initial={'game':kwargs['game']}) 

但是,這並不工作,要麼:

KeyError at /games 
'game' 

回答

1
context['pickform'] = PickForm(initial={'game':context['game_detail']}) 

https://docs.djangoproject.com/en/1.9/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_data

它返回包含以下內容的字典:

object:此視圖顯示的對象(self.object)。

在你的表格你已經設置context_object_name = 'game_detail'

+0

謝謝!這是你告訴我的那些事情之一,我不能相信我錯過了這些。 後續問題:這種方法是否適用於以這種方式在同一頁面上顯示多個表單?或者定義一個將PickForm和Game對象信息組合成單一形式的自定義表單更容易些,然後使用類似formset的東西來處理同一個模板上的多個對象? – dkhaupt

+1

@dkhaupt沒有它完美的罰款在一個視圖中使用多個Django表單(HTML一個裏面''

標籤)......可能更容易和更好的這種辦法,試圖破解在一起的弗蘭肯斯坦怪物形式 – Anentropic

相關問題