让我了解django模型关系,表单和jquery

时间:2009-12-26 05:13:04

标签: jquery django django-models django-templates django-forms

嘿所有,我对django和jquery都很新,但是有几年一般的oo编程经验(主要是flash / flex / cf),我正在试图找出实现a的最佳方法体育锦标赛的形式,管理一些模型关系,并使用一些简单的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'底部类的Tourney外键关系。我希望这些可以通过jquery和popups添加和删除项目的表中表示,但有一些我不确定的事情:

1。)我是否正确设置了模型关系?我还考虑过在Tourney类中使用ManyToMany字段而不是在项目类中使用Tourney外键的想法,正如您从注释掉的行中可以看到的那样。就此而言,我也不确定我是否采用了“位置”字段的最佳方法。

2.。)在Django中构建此表单的最佳方法是什么?我希望尽可能多地使用ModelForm来删除重复定义我自己的字段。我可以看到在ModelForms中传递基本数据和项目弹出窗口,但我不确定它如何与前面提到的外键关系一起工作。那些应该在视图中拼凑起来吗?

3。)如果我使用jquery来管理我的项目列表,那么如何在request.POST对象中包含这些列表呢?我是否只是简单地运行表格中的数据并将其添加到提交时隐藏的选择输入?

感谢阅读。

-Dane

2 个答案:

答案 0 :(得分:1)

通常使用ModelForm和外键一样好。 Django默认为这些字段创建列表项,用户只需选择适当的项。如果生成的列表太长(例如,使用“用户”字段),则可以安排该字段为普通密钥,并在客户端上使用一些jquery以使其实际可用。

答案 1 :(得分:0)

为什么WebLinkItem,EmailContactItem,PhoneContactItem等的模型都继承自TourneyBaseItem?这意味着他们将有一个FK参加比赛。你真的想要吗?

我认为,如您在注释掉的行中定义的M2M关系更好。 因为在FK设计中,您不能对2个或更多不同的项目使用相同的WebLinkItem(它可能是有意义的 - 包含有关几个tourneys的信息的页面)。另一种看待它的方法是,锦标赛不是WebLinkItem的一部分(或定义属性)。