将Django模型+ modelform组合为一个单元

时间:2015-12-10 11:52:22

标签: python django django-forms django-views

我的朋友和我通过笨拙的电子表格玩体育采摘风格的游戏,我决定通过将游戏作为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'

1 个答案:

答案 0 :(得分: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'