Django admin:使用“另存为新文件”时复制内联数据

问题描述 投票:0回答:1

我有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_idpuzzle_index能够重新创建引用新系列的SeriesElements在代码中,我应该用什么代替request.puzzle_idrequest.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']}>
django django-admin inline-formset
1个回答
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数据丢失或已被篡改']

还有其他想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.