了解django模型关系、表单和jquery

了解django模型关系、表单和jquery,jquery,django,django-models,django-templates,django-forms,Jquery,Django,Django Models,Django Templates,Django Forms,大家好,我对django和jquery都很陌生,但有几年的通用oo编程经验(主要是flash/flex/cf),我正试图找出实现体育比赛表单的最佳方法,该表单管理一些模型关系,并使用一些简单的jquery来提高可用性 我的模型是这样的: from django.db import models from django.contrib.auth.models import User from TTHUltimate.countries.models import Country # Create

大家好,我对django和jquery都很陌生,但有几年的通用oo编程经验(主要是flash/flex/cf),我正试图找出实现体育比赛表单的最佳方法,该表单管理一些模型关系,并使用一些简单的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和弹出窗口添加和删除项目,但有几件事我不确定:

1.)我一开始是否正确设置了模型关系?我还考虑了在Tourney类中使用许多字段而不是在item类中使用Tourney外键的想法,正如您从注释掉的行中看到的那样。就这点而言,我也不确定我是否对“位置”字段采取了最佳方法

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

3.)如果我正在使用jquery管理我的项目列表,那么如何将这些列表包括在request.POST对象中?我是否只是在提交时遍历表中的数据并将其添加到隐藏的select输入中

谢谢你的阅读


-Dane

通常可以像外键一样使用
ModelForm
s。默认情况下,Django将为这些字段创建列表项,用户只需选择适当的项即可。如果生成的列表太长(例如,有一个用户字段),您可以将该字段安排为一个普通键,并在客户端上使用一些jquery使其实际可用。

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

我认为最好按照您在注释中定义的M2M关系。
因为在FK设计中,您不能将同一WebLinkItem用于2个或更多不同的项目(这可能是有意义的——一个包含多个巡回赛信息的页面)。从另一个角度来看,锦标赛并不是WebLinkItem的一部分(或定义属性)。

你能用散文的形式描述一下你真正想要建模的东西吗?我很难从你们的模特身上看出全局。当然。主要课程是锦标赛。巡回赛有名称、描述、用户、位置、开始日期、结束日期、电子邮件联系人列表、电话联系人列表、重要链接列表、重要地址列表和重要日期/时间列表(时间表)。谢谢,我认为你说得对,这就是我最初的想法。当我试图找出设置表单的最佳方式时,我感到困惑,但让这种方式影响我如何创建模型是一个错误。谢谢,这很有意义。我知道如何使用基本比赛数据(姓名、描述、开始日期、结束日期等)的模型表单,但我仍然不清楚它们之间的关系,即外键(用于位置)和多对多键(用于联系人列表、链接等)。我可以看到一个单独的模型表单对于位置和向列表中添加联系人、链接等是多么有用,但我仍然不清楚的是如何将它们绑定到主表单,以及如何将来自单独表单或动态jquery驱动列表的数据添加到POST数据中,然后保存整个内容。