我有2个型号:
class Series(models.Model):
puzzles = models.ManyToManyField(Puzzle, through='SeriesElement', related_name='series')
class SeriesElement(models.Model):
puzzle = models.ForeignKey(Puzzle,
on_delete=models.CASCADE,
verbose_name='Puzzle',
)
series = models.ForeignKey(Series,
on_delete=models.CASCADE,
verbose_name='Series',
)
puzzle_index = models.PositiveIntegerField(verbose_name='Order',
default=0,
editable=True,
)
class Meta:
unique_together = ['puzzle', 'series', 'puzzle_index']
ordering=['puzzle_index']
和系列的管理页面显示一个内联的SeriesElement。
class SeriesAdmin(admin.ModelAdmin):
save_as = True
inlines = (SeriesElementInline,)
当我单击“另存为新内容”时,发生错误
通过网络,我收集到我需要重写save_formset,并且以下方法似乎几乎可以正常工作:
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
pdb.set_trace() # for debug
for i in instances:
if hasattr(i, 'puzzle_id') and not i.puzzle_id:
i.puzzle_id = request.puzzle_id # not working
i.puzzle_index= request.puzzle_index # not working
i.save()
formset.save_m2m()
super(SeriesAdmin, self).save_formset(request, form, formset, change)
但是我无法弄清楚如何恢复原始的puzzle_id和puzzle_index能够重新创建引用新系列的SeriesElements在代码中,我应该用什么代替request.puzzle_id和request.puzzle_index来检索原始值?
PS:这是request.POST的内容,所有元素似乎都可以访问,但是我不知道如何正确获取它们:
<QueryDict: {'csrfmiddlewaretoken': ['M0WzCXJ....3Zg'], '_saveasnew': ['Enregistrer en tant que nouveau'], 'fullname': ['s__1x4x4__2D__0-0-2-1-0__112_essai'], 'display_name': ['essai'], 'pzl_sequence_opt_ratio_pieces': ['2.0'], 'pzl_sequence_opt_ratio_difficulty': ['1.5'], 'comment': ['merged from series 121,112,118,122'], 'serieselement_set-TOTAL_FORMS': ['10'], 'serieselement_set-INITIAL_FORMS': ['10'], 'serieselement_set-MIN_NUM_FORMS': ['0'], 'serieselement_set-MAX_NUM_FORMS': ['1000'], 'serieselement_set-0-id': ['1111'], 'serieselement_set-0-series': ['37'], 'serieselement_set-0-puzzle_index': ['1'], 'serieselement_set-1-id': ['1112'], 'serieselement_set-1-series': ['37'], 'serieselement_set-1-puzzle_index': ['2'], 'serieselement_set-2-id': ['1113'], 'serieselement_set-2-series': ['37'], 'serieselement_set-2-puzzle_index': ['3'], 'serieselement_set-3-id': ['1116'], 'serieselement_set-3-series': ['37'], 'serieselement_set-3-puzzle_index': ['4'], 'serieselement_set-4-id': ['1114'], 'serieselement_set-4-series': ['37'], 'serieselement_set-4-puzzle_index': ['5'], 'serieselement_set-5-id': ['1117'], 'serieselement_set-5-series': ['37'], 'serieselement_set-5-puzzle_index': ['6'], 'serieselement_set-6-id': ['1118'], 'serieselement_set-6-series': ['37'], 'serieselement_set-6-puzzle_index': ['7'], 'serieselement_set-7-id': ['1119'], 'serieselement_set-7-series': ['37'], 'serieselement_set-7-puzzle_index': ['8'], 'serieselement_set-8-id': ['1115'], 'serieselement_set-8-series': ['37'], 'serieselement_set-8-puzzle_index': ['9'], 'serieselement_set-9-id': ['1120'], 'serieselement_set-9-series': ['37'], 'serieselement_set-9-puzzle_index': ['10'], 'serieselement_set-__prefix__-id': [''], 'serieselement_set-__prefix__-series': ['37'], 'serieselement_set-__prefix__-puzzle_index': ['0']}>
[我做过的其他测试,试图根据request.POST中包含的数据填充表单集(基于我从https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets推断的内容]
def save_formset(self, request, form, formset, change):
pdb.set_trace() # for debug
SeriesElementFormSet = modelformset_factory(SeriesElement, fields=('series', 'puzzle', 'puzzle_index'))
formset = SeriesElementFormSet(request.POST)
instances = formset.save(commit=False)
for i in instances:
i.series_id = form.instance.id
i.save()
formset.save_m2m()
super(SeriesAdmin, self).save_formset(request, form, formset, change)
但是它不起作用并导致错误:ValidationError:['ManagementForm数据丢失或已被篡改']
还有其他想法吗?