我的朋友和我通过笨拙的电子表格玩体育采摘风格的游戏,我决定通过将游戏作为webapp实现来学习Django。我已经浏览了Django教程,并且我一直在研究在数据库,视图和模板之间传递数据的基础知识。
我尝试将一个模型的信息与不同的模型表单一起显示,然后根据显示的模型处理将该表单保存到数据库。这就是我对模特所拥有的东西:
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
正如你所看到的,Picks有一个Sheet和一个游戏 - 所以一个用户Sheet可以有多个Picks(由于游戏的格式),每个游戏可以有多个选择(因为多个用户可能选择任何给定游戏)。
我的目的是使用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()。
我本可以用完全错误的方式解决这个问题,所以我非常感谢对这个问题的任何建议,或者我是如何构建整个事情的。
编辑:我刚刚意识到self.game可能只有在GameDetail顶部定义为一个字段时才有效,所以我试过了:context['pickform'] = PickForm(initial={'game':kwargs['game']})
但这也不起作用:
KeyError at /games
'game'
答案 0 :(得分:1)
context['pickform'] = PickForm(initial={'game':context['game_detail']})
它返回包含以下内容的字典:
object:此视图正在显示的对象(self.object)。
在表单中,您已设置context_object_name = 'game_detail'