假设我有以下模型 -
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) 确保持久化的Customizable
实例正确地取自由foreignkey 相关的实例所取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))