я смог спасти 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
без много успеха :(
Любые идеи?
Я попытался вставить, что после того, как сохранить и все, что я получил '«Файл»объект не имеет атрибута«save_m2m''. Поэтому я удалил 'save_m2m()' и поместил его в виде как 'formFile.save_m2m()' и получил ту же ошибку :( – Sevenearths
'save_m2m' здесь не понадобится, так как мы сами его сохраняем. –
I удалили 'save_m2m()' и заменили 'temp.client = client' на' temp.client.add (client) 'и я все еще получил экземпляр' 'File' ', чтобы иметь значение первичного ключа перед тем, многие отношения могут быть использованы. ' – Sevenearths