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

Posted

技术标签:

【中文标题】了解 django 模型关系、表单和 jquery【英文标题】:Getting my head around django model relationships, forms, and jquery 【发布时间】:2010-12-30 01:52:33 【问题描述】:

大家好,我对 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 类中使​​用 ManyToMany 字段而不是在项目类中使用 Tourney 外键的想法,正如您从注释掉的行中看到的那样。就此而言,我也不确定我是否对“位置”字段采取了最佳方法。

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

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

感谢阅读。

-丹麦人

【问题讨论】:

你能用散文多描述一下你真正想要建模的东西吗?我很难从你的模型中看到全局。 当然。主要课程是Tourney。锦标赛有名称、描述、用户、位置、开始日期、结束日期、电子邮件联系人列表、电话联系人列表、重要链接列表、重要地址列表和重要列表日期/时间(时间表)。 【参考方案1】:

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

【讨论】:

谢谢,这很有道理。我了解如何将模型表格用于基本锦标赛数据(名称、描述、开始日期、结束日期等),但我仍然对关系有点不清楚,即外键(用于位置)和多对多(用于我的联系人、链接等列表)。我可以看到一个单独的模型表单对于位置以及将联系人、链接等添加到列表中是如何有用的,但是我仍然模糊的地方是我如何将它们与主表单联系起来,以及我将如何添加数据从单独的表单或动态 jquery 驱动列表到 POST 数据,然后保存整个内容。【参考方案2】:

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

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

【讨论】:

谢谢,我认为你是对的,这就是我最初的想法。当我试图找出设置表单的最佳方法时,我感到很困惑,但是让这种影响我如何做模型是错误的。

以上是关于了解 django 模型关系、表单和 jquery的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 序列化器作为表单和嵌套关系

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系

如何使用 django 表单/模型来表示字段之间的选择?

具有多对多关系的Django表单不保存

Django:模型和视图以及 jQuery DataTables,hello world 示例

将 Django 模型验证错误传输到表单的惯用方式