Рассказать о модельных отношениях, формах и jquery в Django - PullRequest
0 голосов
/ 26 декабря 2009

Привет всем, я довольно новичок как в 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() 

Моя главная проблема заключается в том, как обращаться с отношениями внешних ключей Tourney для классов в нижней части, которые расширяют 'TourneyBaseItem'. Я хотел бы, чтобы они были представлены в таблицах, в которые можно добавлять и удалять элементы с помощью jquery и всплывающих окон, но есть некоторые вещи, в которых я не уверен:

1.) Правильно ли я настроил отношения модели для начала? Я также рассмотрел идею использования полей ManyToMany в классе Tourney вместо внешнего ключа Tourney в классах предметов, как вы можете видеть из закомментированных строк. В этом отношении я также не уверен, что выбрал лучший подход с полем 'location'.

2.) Как лучше всего построить эту форму в Django? Я надеялся максимально использовать ModelForm, чтобы убрать повторение определения моих собственных полей. Я вижу передачу ModelForms для основных данных и всплывающих окон элементов, но я не уверен, как это будет работать с ранее упомянутыми отношениями внешнего ключа. Должны ли они быть соединены в виде?

3.) Если я использую jquery для управления списками своих товаров, как мне тогда включить эти списки в объект request.POST? Должен ли я просто просмотреть данные в таблицах и добавить их к скрытым выбранным данным при отправке?

Спасибо за чтение.

-Dane

Ответы [ 2 ]

1 голос
/ 26 декабря 2009

Обычно нормально использовать ModelForm s как с внешними ключами. Django создаст элементы списка по умолчанию для этих полей, и пользователи могут просто выбрать соответствующий элемент. Если сгенерированный список будет слишком длинным (скажем, с полем «Пользователи»), вы можете сделать так, чтобы поле было простым ключом, и использовать некоторый jquery на клиенте, чтобы сделать его действительно полезным.

0 голосов
/ 26 декабря 2009

Почему модели для WebLinkItem, EmailContactItem, PhoneContactItem и т. Д. Все унаследованы от TourneyBaseItem? Это означает, что у них будет ФК на турнир. Вы действительно этого хотите?

Я думаю, что лучше иметь отношения M2M, как вы определили в закомментированных вами строках. Потому что в дизайне FK нельзя использовать один и тот же WebLinkItem для двух или более разных проектов (и это может иметь смысл - страница, содержащая информацию о нескольких турнирах). Другой способ взглянуть на это состоит в том, что турнир просто не является частью (или определяющим атрибутом) WebLinkItem.

...