Добавление данных в поле «многие ко многим» формы модели в представлении - PullRequest
1 голос
/ 27 февраля 2009
class Person(models.Model):
    name = models.CharField(max_length=100)

class Entry(models.Model):
    text = models.CharField(max_length=100)
    person = models.ManyToManyField(Person, blank=True, null=True)

class MyModelForm(forms.ModelForm):
    class Meta:
        model = Entry

На мой взгляд, мне нужно добавить pk id в отправленную форму перед сохранением.

data = request.POST.copy()
# 'person' is a ManyToManyField to a 'Person' model
# a form would normally send multiple id's as POST in this format -> u'id': [u'1', u'2']
# u'1,2' (an example) is a str variable accessible to the view
data[u'person'] = u'1,2'.split(",") 
form = MyModelForm(data)
if form.is_valid():
    form.save()

Это дает мне:

Аргумент int () должен быть строкой или номер, а не «список»

Что достаточно справедливо. Это работает в случае:

data[u'person'] = u'1'

Я тоже пытался безуспешно:

new_form = form.save(commit=False)
new_form.person = u'1,2'.split(",")
new_form.save()
form.save_m2m()

Как сохранить несколько идентификаторов в этом ManyToManyField?
Должно быть легко, но я упускаю суть.


EDIT: Желаемый результат - один новый экземпляр MyModelForm (в таблице 'entry') со всеми идентификаторами, сохраненными для form.person (несколько записей в таблице 'entry_person').


UPDATE: Я, кажется, изолировал проблему.

Если я сделаю:

data = {}  
data[u'person'] = u'1,2'.split(",")

Это работает в результате:

{u'person': [u'1', u'2'],}  

Если я это сделаю:

data = request.POST.copy()  
data[u'person'] = u'1,2'.split(",")

Это НЕ работает (выдает ошибку, описанную выше), в результате:

<QueryDict: {u'person': [[u'1', u'2']],}>

Так что все, что мне нужно, это иметь

<QueryDict: {u'person': [u'1', u'2'],}>

Есть предложения как?

Ответы [ 3 ]

1 голос
/ 06 марта 2009
0 голосов
/ 27 февраля 2009

Попробуйте:

new_form.person = [int(x) for x in u'1,2'.split(",")]

Это установит new_form.person в список целых, а не в список строк.

0 голосов
/ 27 февраля 2009

Введенный вами разделитель возвращает следующее:

[u'1', u'2']

Чтобы создать несколько экземпляров в вашей базе данных, вам нужно выполнить итерации по списку:

for x in u'1,2'.split(","):
  data[u'person'] = x
  form = MyModelForm(data)
  if form.is_valid():
    form.save()

Из любопытства, зачем преобразование строки в список? Или это просто общий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...