次のモデルがあるとします-
class Item(models.Model):
name = models.CharField(max_length=150)
value = models.DecimalField(max_digits=12,decimal_places=2)
class Organization(models.Model):
name = models.CharField(max_length=150)
items = models.ManyToManyField(Item, through='Customizable')
class Customizable(models.Model):
organization = models.ForeignKey(Organization)
item = models.ForeignKey (Item)
value = models.DecimalField(max_digits=12,decimal_places=2)
多くの場合、 にitems
「割り当て」られると、関連するオブジェクトorganization
に最初に記録された値と同じ値になります。Item
ただし、場合によっては、組織に割り当てられたアイテムが上書きされることがありますvalue
(したがって、中間モデル)。元の値を上書きすることはめったに起こらないので (実際には起こります)、ユーザーがインスタンスitems
のリストから必要なものを選択Item
して、それらを組織のインスタンスに割り当てることができるようにしたいと考えています。ユーザーは、一括割り当てが完了した後で個々の値を上書きするオプションを利用できます。
だから私は次の単純なModelFormを持っています -
class AssignItemsForm(forms.ModelForm):
items = forms.ModelMultipleChoiceField(queryset=Item.objects.all(),required=False,widget=forms.CheckboxSelectMultiple)
class Meta:
model = Organization
exclude = ('name',)
モデルがあるthrough
ので、単純な form.save() は機能しません。(i)Customizable
ユーザーが選択したアイテムに対応するインスタンスを保存し、(ii) 永続化されたインスタンスが、foreignkey によって関連付けられたインスタンスから取得された対応するインスタンスからCustomizable
適切に取得されていることを確認する必要があります。value
value
item
私はビューでそれを処理しようとしています (しかし、私の心はブロックされています) -
def assign_items(request, oid):
organization = Organization.objects.get(id=oid)
if request.method == 'POST':
form = AssignItemsForm(data=request.POST, instance=organization)
if form.is_valid():
current_organization = form.save(commit=False)
#
#placeholder to save Customizable instances here
#
return HttpResponseRedirect(reverse('redirect-someplace-else'))
else:
form = AssignItemsForm(instance=organization,)
return render_to_response("assign_items.html", {"form": form,}, context_instance=RequestContext(request))