2009-12-26 19 views
0

大家好,我對django和jquery都相當陌生,但擁有幾年的一般oo編程經驗(主要是flash/flex/cf),而且我試圖找出最佳的方式來實現一個體育比賽的形式,管理幾個模型的關係,並使用一些簡單的jQuery來提高可用性。讓我的頭繞着django模型關係,表單和jquery

我的模式是這樣的:

from django.db import models 
from django.contrib.auth.models import User 
from TTHUltimate.countries.models import Country 

# Create your models here. 

class BaseItem(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.TextField(blank=True, max_length=5000) 

    def __unicode__(self): 
     return self.name 

class Location(models.Model): 
    country = models.ForeignKey(Country) 
    state_province = models.CharField(max_length = 100) 
    city = models.CharField(max_length = 100) 

    def __unicode__(self): 
     return '%s, %s, %s' % (self.city,self.state_province,self.country) 

class Address(models.Model): 
    location = models.ForeignKey(Location) 
    address = models.CharField(max_length = 500) 
    postalCode = models.CharField(max_length = 20) 

    def __unicode__(self): 
     return '%s, %s %s' % (self.address, self.location.unicode(),self.postalCode) 

class Tourney(BaseItem): 
    user = models.ForeignKey(User) 
    location = models.ForeignKey(Location, verbose_name='Location') 

    startDate = models.DateField('Start Date') 
    endDate = models.DateField('End Date',blank=True,null=True) 

    # webLinks = models.ManyToManyField(WebLinkItem, verbose_name='Web Links') 
    # emailContacts = models.ManyToManyField(EmailContactItem, verbose_name='Email Contacts') 
    # phoneContacts = models.ManyToManyField(PhoneContactItem, verbose_name='Phone Contacts') 
    # addressItems = models.ManyToManyField(AddressItem, verbose_name='Important Addresses') 
    # scheduleItems = models.ManyToManyField(ScheduleItem, verbose_name='Schedule') 

class TourneyBaseItem(BaseItem): 
    tourney = models.ForeignKey(Tourney) 

class WebLinkItem(TourneyBaseItem): 
    url = models.URLField() 

class EmailContactItem(TourneyBaseItem): 
    email = models.EmailField() 

class PhoneContactItem(TourneyBaseItem): 
    phone = models.CharField(max_length=50) 

class AddressItem(TourneyBaseItem): 
    address = models.ForeignKey(Address) 

class ScheduleItem(TourneyBaseItem): 
    datetime = models.DateTimeField() 

我的主要問題是如何處理在底部延伸「TourneyBaseItem」類的錦標賽外鍵關係。我希望這些表格可以通過jQuery和彈出窗口添加和刪除項目,但有幾件事我不確定:

1.)我是否正確設置了模型關係首先?我還考慮過在Tourney類中使用ManyToMany字段,而不是項類中的Tourney外鍵,正如您從註釋掉的行中可以看到的那樣。對於這個問題,我也不確定我是否採用了'位置'字段的最佳方法。

2.)在Django中構造這個表單的最好方法是什麼?我希望儘可能多地使用ModelForm來消除重複定義自己的字段。我可以看到在ModelForms中傳遞基本數據和項目彈出窗口,但我不確定它如何與前面提到的外鍵關係一起工作。如果這些在視圖中拼湊在一起?

3.)如果我使用jquery來管理我的項目列表,那麼如何將這些列表包含在request.POST對象中?我只是簡單地瀏覽表格中的數據,並將它們添加到提交的隱藏的選擇輸入中?

感謝您的閱讀。

-Dane

+1

你能以散文形式描述一下你實際想要建模的東西嗎?我很難從模型中看到大局。 – SingleNegationElimination 2009-12-26 06:20:40

+0

當然。主要的類是Tourney。 Tourneys有一個名稱,描述,用戶,位置,開始日期,結束日期,電子郵件聯繫人列表,電話聯繫人列表,重要鏈接列表,重要地址列表以及重要列表日期/時間(日程安排)。 – Dane 2009-12-26 21:01:51

回答

1

它通常是蠻好用ModelForm S作爲與外鍵。 Django將默認爲這些字段創建列表項,用戶可以選擇適當的項目。如果生成的列表太長(比如用Users字段),你可以安排這個字段是一個普通的鍵,並在客戶端使用一些jQuery來使其真正可用。

+0

謝謝,這很有道理。我看到我可以如何使用模型表單作爲基本的錦標賽數據(名稱,描述,開始日期,結束日期等),但我仍然對關係有點不清楚,即外鍵(對於位置)和許多對於manys爲我的聯繫人列表,鏈接等)。我可以看到一個單獨的模型表單如何對位置和添加聯繫人,鏈接等有用。列表,但我仍然模糊的是如何將這些內容綁定到主窗體,以及如何將數據從單獨的窗體或從動態jQuery驅動列表添加到POST數據,然後保存整個事物。 – Dane 2009-12-26 21:13:39

0

爲什麼WebLinkItem,EmailContactItem,PhoneContactItem等的模型都是從TourneyBaseItem繼承的?這意味着他們將有一個FK參加錦標賽。你真的想要嗎?

我認爲最好是在您註釋掉的行中定義M2M關係。 因爲在FK設計中,不能爲2個或更多不同的項目使用相同的WebLinkItem(它可能是有意義的 - 一個包含幾個tourneys信息的頁面)。另一種看待它的方式是,錦標賽不是WebLinkItem的一部分(或定義屬性)。

+0

謝謝,我認爲你是對的,這就是我最初想的。當我試圖找出設置表單的最佳方式時,我感到困惑,但讓這種效果影響我的模型是錯誤的。 – Dane 2009-12-26 21:03:31