Предположим, у меня есть следующие модели -
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
экземпляры имеют правильные value
, взятые из соответствующих value
, взятых из item
экземпляр, связанный с Foreignkey.
Я пытаюсь обработать его в представлении (но мой разум заблокирован) -
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))