Formwizards для редактирования в Джанго - PullRequest
0 голосов
/ 06 апреля 2010

Я нахожусь в процессе создания веб-приложения, и у этого веб-приложения должен быть мастер форм. Мастер состоит из 3 ModelForms, и он работает без нареканий. Но мне нужно, чтобы вторая форма была «формой редактирования». То есть мне нужно, чтобы это была форма, которой передается экземпляр.

Как вы можете сделать это с помощью мастера форм? Как вы проходите в экземпляре модели? Я вижу, что класс FormWizard имеет метод get_form, но нет ли документированного способа использования мастера форм для редактирования / просмотра данных?

Ответы [ 3 ]

4 голосов
/ 16 июля 2012

В Django 1.4 вы можете сделать что-то вроде:

def edit(request):
    initial = {
       0: {'subject': 'Hello', 'sender': 'user@example.com'},
       1: {'message': 'Hi there!'}
       }
    wiz = FormWizard([form1,form2,form3],initial_dict = initial)
    return wiz(request)
0 голосов
/ 25 октября 2012

Я думаю, что есть несколько подходов, в зависимости от того, насколько сложны данные, которые вы должны передать.

Вы можете следовать инструкциям здесь: https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#providing-initial-data-for-the-forms и создайте исходный словарь, который вы передаете представлению в urls.py, примерно так:

>>> initial = {
...     '0': {'subject': 'Hello', 'sender': 'user@example.com'},
...     '1': {'message': 'Hi there!'}
... }
>>> wiz = ContactWizard.as_view([ContactForm1, ContactForm2], initial_dict=initial)

Ваш другой вариант, и он более сложный, но позволит вам иметь немного больше логики, это переопределить get_initkwargs и поместить туда логику (см. Код Django: https://github.com/django/django/blob/master/django/contrib/formtools/wizard/views.py).

Наконец, если вам нужно предоставить объект, основанный на вводе предыдущей формы, то это будет довольно сложно, потому что get_initkwargs - это метод класса, и начальные словари необходимо передавать при запуске мастера. Но, вероятно, вы можете сделать это, переопределив get_form_kwargs:

def get_form_kwargs(self, step=None):
    kwargs = {}
    if step != '0':
        your_field = self.get_cleaned_data_for_step('0')['your_field']
        # logic for getting object based on field goes here
        kwargs.update({'object': object,})
    return kwargs

Тогда вы можете использовать метод init формы, чтобы установить начальные значения, основанные на объекте, который вы передали в kwargs. Я часто использую последний кусок кода, но на самом деле не использовал предыдущие.

0 голосов
/ 06 апреля 2010

вы можете использовать класс formwizard в представлении и передать туда начальное значение, например:

def edit(request):
    initial = {0: {'field1':'value1'}}
    return FormWizard([form, some_other_form], initial=initial)

, где initial должен быть dict с ключами, равными шагам, а значения являются dict данных, как для обычной формы.

...