我有一个模型日历,并且我希望能够创建多个实例。
以下是我的模特:
class Event(models.Model):
user = models.ForeignKey(User)
class Group(models.Model):
name = models.CharField(_('Name'), max_length=80)
events = models.ManyToManyField(Event, through='Calendar')
class Calendar(models.Model):
event = models.ForeignKey(Event)
group = models.ForeignKey(Group)
class CalendarInline(admin.TabularInline):
model = Calendar
extra = 1
class GroupAdmin(admin.ModelAdmin):
inlines = (CalendarInline,)
以下是我尝试编写表单的方法:
class AddEventToGroupForm(ModelForm):
group = ModelMultipleChoiceField(queryset=Group.objects.all(), widget=SelectMultiple())
def save(self):
for g in self:
g.save()
class Meta:
model = Calendar
fields = ('group',)
这是我观点的一部分:
e = Event.objects.get(id=event_id)
calentry = Calendar(event=e)
if request.POST:
f = AddEventToGroupForm(data=request.POST, instance=calentry)
if f.is_valid():
f.save()
如果我尝试提交该表格,我会:
AttributeError at /groups/add_event/7/
'BoundField' object has no attribute 'save'
在此中创建多个Calendar实例的正确方法是什么 情况?
答案 0 :(得分:2)
这不是如何处理表格中的多对多关系。你不能遍历表单中的字段并保存它们,它实际上不会那样工作。
在这种形式中,只有一个字段,恰好有多个值。这里要做的是迭代这个字段的 values ,你可以在cleaned_data
字典中找到它(当表单有效时)。
因此,在您看来,您可以执行以下操作:
if f.is_valid():
for group in f.cleaned_data['group']:
calentry.groups.add(group)
请注意,您根本没有“保存”AddEventToGroupForm表单。我会把它变成标准的form.Form,而不是ModelForm,因为你并不真正依赖于任何ModelForm功能。