Django admin: репликация данных InLine при использовании «Сохранить как новый» - PullRequest
0 голосов
/ 11 марта 2020

У меня есть 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'] 

, и на странице администрирования Series отображается встроенный элемент SeriesElement.

class SeriesAdmin(admin.ModelAdmin):
   save_as = True
   inlines = (SeriesElementInline,)

Когда я нажимаю «сохранить как новый», происходит ошибка

, проходя через net, я понял, что мне нужно переопределить 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, которые ссылаются на новые серии в коде, что я должен поместить вместо запроса .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']}>

1 Ответ

0 голосов
/ 12 марта 2020

Другой тест, который я провел, пытался заполнить набор форм на основе данных, содержащихся в запросе. ПОЧТА (на основе того, что я экстраполировал из https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model -формцетов )

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 отсутствуют или подделаны']

Есть еще идеи?

...