Загрузка и сохранение данных из отношений m2m в виджетах Textarea с ModelForm - PullRequest
0 голосов
/ 11 августа 2009

У меня есть модель, которая выглядит примерно так:

class Business(models.Model):
    name = models.CharField('business name', max_length=100)
    # ... some other fields
    emails = models.ManyToManyField(Email, null=True)
    phone_numbers = models.ManyToManyField(PhoneNumber, null=True)
    urls = models.ManyToManyField(URL, null=True)

и соответствующая ModelForm:

class BusinessContactForm(forms.ModelForm):
    emails = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32}))
    phone_numbers = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32}))
    urls = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32}))

    class Meta:
        model = Business
        fields = ['emails', 'phone_numbers', 'urls',]

Мой вопрос: Каков наилучший способ загрузки существующих электронных писем, телефонных номеров и URL-адресов в виджеты Textarea при представлении формы (по одному на строку в соответствующих виджетах)?

Затем, после того, как форма была изменена и отправлена, как лучше всего добавить новые электронные письма, номера или URL-адреса (отношения m2m) и удалить все, которых больше нет в списке (также убедившись, что не добавлять дубликаты)?

Ответы [ 2 ]

1 голос
/ 11 августа 2009

Это действительно не очень хороший способ сделать это. Работа со связанными элементами в формах - это то, для чего formsets .

Вместо определения связанных полей в качестве дополнительных полей в модели BusinessForm используйте стандартную форму для контакта с электронной почтой, телефоном и URL-адресом. Затем передайте это в modelformset_factory, чтобы создать встроенный набор форм для вашей формы BusinessContact.

1 голос
/ 11 августа 2009

Это не прямой ответ на ваш вопрос. Это скорее предложение переосмыслить вашу модель данных.

Похоже, что ваша BusinessContactForm представляет виджеты textarea для вставки нескольких строк в базу данных. Я бы не использовал виджет Textarea для нескольких элементов более ограниченного типа: я бы вводил номера телефонов с виджетом номера телефона, URL-адреса с виджетом URL-адреса и письма с виджетом электронной почты.

Деловой контакт - это действительно человек, который работает в компании и имеет адрес электронной почты и номер телефона, верно? Так почему бы не смоделировать такой деловой контакт и не получить внешний ключ к бизнесу?

Это больше подход, который я выбрал бы.

...