Мастер импорта Django с использованием JSON

Я пытаюсь создать мастер для импорта нескольких моделей в Django с использованием JSON. Я хочу иметь возможность:

  1. перейдите по URL-адресу, например entries/import/, который отобразит текстовое поле
  2. где я могу вставить некоторые записи JSON и нажать «Отправить»
  3. который затем приведет меня к шагу 2 мастера, где мне будет представлен список типовых форм
  4. где после проверки/изменения некоторых данных я могу нажать «Отправить» и сохранить все записи

Похоже, я хочу использовать мастер форм в сочетании с FormSet. У меня выполнены шаги 1 и 2, но я не могу понять, как представить все модели в виде форм на шаге 2 мастера.

Я наткнулся на эту ссылку, которая показывает, где Я мог бы преобразовать JSON в FormSet, но пока не смог заставить его работать. Ниже приведено то, что я считаю соответствующим кодом. Можете ли вы помочь мне понять, как передать набор форм на шаг 2?

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ['text', 'tags']

class ImportForm(forms.Form):
    json = forms.CharField(widget=forms.Textarea, label='JSON')

class ImportSelectionForm(forms.Form):
    entryFormSet = formset_factory(EntryForm)

FORMS = (
    ("step1", ImportForm),
    ("step2", ImportSelectionForm),
)

TEMPLATES = {
    "step1": "entries/json_form.html",
    "step2": "entries/entry_import_form.html",
}

class ImportWizard(SessionWizardView):
    def get_template_names(self):
        return [TEMPLATES[self.steps.current]]

    def get_form_initial(self, step):
        current_step = self.storage.current_step

        if current_step == 'step2':
            # Not getting here for some reason after submitting step1
            prev_data = self.storage.get_step_data('step1')
            json = prev_data.get('step1-json', '')

            models = serializers.deserialize("json", json)
            EntryFormSet = formset_factory(EntryForm)
            formset = EntryFormSet(self.request.POST, self.request.FILES)

            return self.initial_dict.get(step, {'formset': formset})

        return self.initial_dict.get(step, {})

    def done(self, form_list, **kwargs):
        return HttpResponseRedirect(revierse_lazy('entries:index'))

person E-rich    schedule 31.01.2015    source источник
comment
возможно, сделайте переход к шагу 2 перенаправлением на определенный URL-адрес, где вы добавляете идентификатор только что созданных моделей и отображаете их. Вы можете написать только один http-ответ, а затем отправить его. У вас также, кажется, опечатка: revierse_lazy   -  person Paul Collingwood    schedule 31.01.2015
comment
Намерение состоит в том, чтобы не создавать модели до отправки шага 2, поэтому у них не будет идентификаторов во время шага 2. В конечном итоге я хочу позволить пользователю выбирать, какие записи создавать на шаге 2, но решил, что начальным шагом будет просто создать их все. Я также хотел бы, чтобы URL-адрес был чистым. Спасибо, что указали на опечатку.   -  person E-rich    schedule 31.01.2015


Ответы (1)


Вы должны просто использовать параметр step, переданный методу get_form_initial, вместо использования self.storage.current_step. После тестирования я заметил, что self.storage.current_step содержит предыдущий шаг.

Также обратите внимание, что по какой-то причине get_form_initial обрабатывается дважды, один раз для предыдущего и один раз для текущего шага.

person GwynBleidD    schedule 31.01.2015
comment
Это помогло войти в состояние шага 2 в get_form_initial, но я все еще не получаю никаких форм на шаге 2. - person E-rich; 01.02.2015