2011-10-04 4 views
1

я смог спасти m2m отношения с формами в прошлом, но я в настоящее время есть проблемы с следующим, и я не могу понять, почему:Django проблема с сохранением отношений M2M

# models.py 

class File(models.Model): 
    client = models.ManyToManyField(Client) 
    product = models.ForeignKey(Product, related_name='item_product') 
    created = models.DateTimeField(default=datetime.now) 
    created_by = models.ForeignKey(User) 

# forms.py 

class FileForm(ModelForm): 

    class Meta: 
     model = File 
     exclude = ('client') 

    def CustomSave(self,product,client,user): 
     temp = self.save(commit=False) 
     temp.product = product 
     temp.client = client # < ?!?! 
     temp.created_by = user 
     temp.save() 
     temp.save_m2m() 
     return temp 

# views.py 

def new_client_view(request): 

    if request.method == 'POST': 
     try: 
      i_product = int(request.POST['product']) 
     except ValueError: 
      raise Http404() 
     # get a 'product' from the POST data 
     p = Product.objects.get(id=i_product) 

     formFile = FileForm(p, request.POST, auto_id='f_%s') 
     formItemData = ItemDataForm(p, request.POST, auto_id='i_%s') 

     if formFile.is_valid() and formItemData.is_valid(): 
      c = Client() 
      c.save() 
      tempFile = formFile.CustomSave(p,c,request.user) 
      tempItem = ItemForm().CustomSave(tempFile,request.user) 
      formItemData.CustomSave(tempItem,request.user) 
      return redirect(client_view, c.id) 
     else: 
      return render_to_response('newClient.html', {'error':'The form was not valid'}, context_instance=RequestContext(request)) 
    else: 
     return render_to_response('newClient.html', {}, context_instance=RequestContext(request)) 

Когда я попробуйте выше я получаю:

'File' instance needs to have a primary key value before a many-to-many relationship can be used. 

И Джанго указывает ошибка происходит от temp.client = client

Я пробовал различные перестановки CustomSave без много успеха :(

Любые идеи?

ответ

3

Вы пытаетесь назначить одного клиента в поле ManyToMany. Это будет работать, если он был ForeignKey Клиенту, но ManyToMany, вы должны сделать что-то вроде:

temp.client.add(client) 

Примечание: temp должны быть сохранены первым, прежде чем вы можете назначить клиентов. Это связано с тем, что в таблице Django используется сопоставление клиентов с файлами, и если файл не существует, вы не можете добавить строку с нулевым ключом. Глядя на структуру таблицы, Django генерирует, должен помочь разобраться.

+0

Я попытался вставить, что после того, как сохранить и все, что я получил '«Файл»объект не имеет атрибута«save_m2m''. Поэтому я удалил 'save_m2m()' и поместил его в виде как 'formFile.save_m2m()' и получил ту же ошибку :( – Sevenearths

+0

'save_m2m' здесь не понадобится, так как мы сами его сохраняем. –

+0

I удалили 'save_m2m()' и заменили 'temp.client = client' на' temp.client.add (client) 'и я все еще получил экземпляр' 'File' ', чтобы иметь значение первичного ключа перед тем, многие отношения могут быть использованы. ' – Sevenearths

2

Вы пытаетесь сохранить связь m2m до того, как объект был сохранен (commit = False). Чтобы создать связь между клиентом и файлом, сначала необходимо сохранить файл.

Смотрите здесь: Django: instance needs to have a primary key value before a many-to-many relationship

+0

, что сообщение не показывает, где вы должны использовать 'save_m2m()' в коде – Sevenearths

+0

save_m2m является альтернативой его выполнению вручную, поскольку код предлагает –

+0

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method –

Смежные вопросы