フォームから多対多のフィールドを保存するのに問題があります。これが私のモデルです:
class TextIssue(models.Model):
Issue = models.CharField(max_length=150, unique=True)
def __unicode__(self):
return self.Issue
class PadIssue(models.Model):
Issue = models.CharField(max_length=150, unique=True)
def __unicode__(self):
return self.Issue
class PHIssue(models.Model):
Data = models.ForeignKey(Data)
TextIssue = models.ManyToManyField(TextIssue, blank=True, null=True)
PadIssue = models.ManyToManyField(PadIssue, blank=True, null=True)
Notes = models.TextField()
def clean(self):
from Django.core.exceptions import ValidationError
if self.TextIssue is None and self.PadIssue is None:
raise ValidationError('You must choose at least one issue category.')
if self.Notes is None:
raise ValidationError('You must write a note regarding the issues selected above.')
class PHIssueForm(ModelForm):
class Meta:
model = PHIssue
exclude = ('Data',)
そしてここで、views.pyで投稿リクエストを処理します。
def process_npiform(request, npi_id=None):
if npi_id:
try:
npi = Data.objects.get(id=int(npi_id))
except:
raise Http404
if request.method == 'POST':
data = DataForm(request.POST, instance=npi, prefix='npi_data')
if data.is_valid():
update = data.save(commit=False)
if not request.user.is_superuser:
update.User = request.user
update.save()
if update.Status == 'past-due':
try:
prefab = PHIssue.objects.get(Data=npi)
except:
prefab = PHIssue(Data=Data.objects.get(id=int(update.id)))
prefab.save()
issue = PHIssueForm(request.POST, instance=prefab, prefix='npi_issue')
if issue.is_valid():
save_issue = issue.save(commit=False)
save_issue.save()
return HttpResponseRedirect(reverse('pm'))
else:
return render_to_response('npi/data.html', {'data': data, 'issue': issue}, context_instance=RequestContext(request))
else:
return HttpResponseRedirect(reverse('pm'))
フォームを使用して保存するときは常に、PHIssueインスタンスにNotesテキストフィールドのみが保存され、多対多のフィールドは空白のままになります。誰かが私が何が悪いのかを見つけるのを手伝ってくれる?
http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method
_commit=False
_を使用する場合、save_m2m()
を呼び出す必要があります
m2m関係では、親オブジェクトを最初に保存する必要がありますが、これは_commit=False
_を使用して実行するのではありません
たとえば、次のようにすることができます。
if todo_list_form.is_valid():
todo_list = todo_list_form.save(commit=False)
todo_list.save()
todo_list_form.save_m2m()