2013-07-30 56 views
1

我對Python和Django都是全新的,所以請原諒,如果這個問題有點簡單。Django ModelForm或表格

我正在寫一個小應用程序來跟蹤檯球比賽的比分。我不需要解釋所有的細節,但涉及的基本對象是:

球隊有球員 比賽是兩隊之間(主客場) 比賽有一個遊戲集合。 每場比賽在兩名球員(每支球隊一名球員)之間,不包括已經參加比賽的球員。

我已經做了以下型號:

class Team(models.Model): 
    team_id = models.IntegerField(unique=True, max_length=5, blank=False,validators=[validate_five_digits]) 
    name = models.CharField(max_length=50, blank=False, null=False) 


class Player(models.Model): 
    id = models.IntegerField(unique=True, max_length=5, blank=False,validators=[validate_five_digits]) 
    team = models.ForeignKey(Team, blank=True, null=True) 
    first_name = models.CharField(max_length=50, blank=False, null=False) 
    last_name = models.CharField(max_length=50, blank=False, null=False) 
    alias_name = models.CharField(max_length=50, blank=True, null=True) 
    current_handicap = models.IntegerField() 

class Match(models.Model): 
    date = models.DateField(blank=False, null=False) 
    location = models.CharField(max_length=255, blank=True, null=True) 
    table_size = models.CharField(max_length=50, blank=True, null=True) 
    home_team = models.ForeignKey(Team, related_name='home_team', blank=True, null=True) 
    away_team = models.ForeignKey(Team, related_name='away_team', blank=True, null=True) 


class Game(models.Model): 
    match = models.ForeignKey(Match, blank=False, null=False) 
    match_sequence = models.IntegerField(blank=True, null=True) 
    player1 = models.ForeignKey(Player,related_name='player1', blank=False, null=False) 
    player2 = models.ForeignKey(Player,related_name='player2', blank=False, null=False) 
    player1_handicap = models.IntegerField(null=True, blank=True) 
    player2_handicap = models.IntegerField(null=True, blank=True) 

我已經成功地進行了查看,並ModelForms添加/編輯球隊,球員和比賽。 匹配列表顯示在一個表中,每行有1個匹配....現在我想要添加一個按鈕來添加一個新的遊戲。

我的計劃是由具有按鈕進入到一個URL看起來像這樣這樣做:

game/new/?match_id=1 (or something like that) 

現在對於我的困惑.....當你添加一個新的部分遊戲,我想顯示3個選擇字段,並且只有3個選擇字段。 第一選擇字段應該顯示來自主隊球員還沒有在這場比賽中 第二選擇字段應顯示來自尚未在一場比賽一場比賽客場球隊球員打過一場比賽 第三選擇字段將只有兩種選擇(主場和客場)......並且會指示哪位球員首先出手。

然後,當用戶點擊提交時,它需要使用查詢字符串中的match_id,匹配的下一個序列號以及Player1 =根據第三個選擇字段的home或away選項創建一個Game()對象。

我完全不知道應該怎麼做....應該使用forms.Form還是ModelForm?

任何建議或骨架代碼來暗示我?

在此先感謝您的幫助,這樣一個新手問題!

保羅

+1

我會採取'ModelForm'任何一天超過'Form' – karthikr

回答

1

什麼類型的窗體類的構建Django應用程序時使用的是一個簡單的問題。如果您正在編輯模型,請使用ModelForm,否則使用Form

如果您需要限制的選擇或根據其它數據改變的選擇,你仍然可以做到這一點與一個ModelForm通過重寫形式的__init__()

使用ModelForm將減少所需的代碼量添加Game實例,因爲ModelForm已經知道如何創建或更新Game的實例。如果您只是使用Form類,則必須自己處理。

+0

感謝布蘭登,這就是我想,但不知道。我的問題的下一部分是不太清楚....三個選擇字段我想顯示不直接鏈接到一個特定的模式場。所以HomeTeam下拉菜單總會顯示主隊的球員,AayaTeam下拉菜單總是會顯示AwayTeam中的球員。它們不會直接與player1和player2字段相關聯。這是因爲它取決於在下拉菜單中選擇的關於哪個球隊是「player1」的答案。不知道在哪裏我處理這個....你能提出建議嗎? –

+0

ModelForms可以由與模型本身沒有直接關係的字段組成,也可以通過ajax基於其他字段或通過更改選項上的css顯示類來覆蓋選項。所以,你可以採取的方法很少。 – Brandon