我和朋友們通過一個笨拙的電子表格來玩體育採摘遊戲,我決定通過將遊戲作爲一個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'
謝謝!這是你告訴我的那些事情之一,我不能相信我錯過了這些。 後續問題:這種方法是否適用於以這種方式在同一頁面上顯示多個表單?或者定義一個將PickForm和Game對象信息組合成單一形式的自定義表單更容易些,然後使用類似formset的東西來處理同一個模板上的多個對象? – dkhaupt
@dkhaupt沒有它完美的罰款在一個視圖中使用多個Django表單(HTML一個裏面''