Первоначальный параметр Django UpdateView передан другим UpdateView - PullRequest
0 голосов
/ 07 марта 2019

У меня есть два вида обновлений, к которым обращаются с разными URL.В первом представлении об обновлении CreateType я установил переменную в моем первоначальном названии old_type.После того, как я отправляю и просматриваю другие представления, я оказываюсь во втором UpdateView CreateSchedule.если я печатаю self.initial во втором представлении, я нахожу переменную old_type, которую я по какой-то причине установил в своем первом UpdateView.

первый просмотр

class CreateType(views.UpdateView):
    """
    Create type form
    """
    model = Group
    form_class = TypeForm
    template_name = 'create.html'
    extra_context = {'has_fifth_steps': False, 'active_step': 1, 'progress': 0}

    def get_object(self, queryset=None):
        object = super(CreateType, self).get_object(queryset)
        self.initial['old_type'] = object.type
        return object

    def form_valid(self, form):
        object = form.save()
        if object.type == Group.TYPE_SINGLE and self.initial['old_type'] == Group.TYPE_MULTIPLE:
            first_obj = Obj.objects.filter(group=object).values('id').first()
            if first_obj:
                Obj.objects.filter(group=object).exclude(id=first_obj['id']).delete()
        return redirect('create_obj.debtor', pk=object.pk)

мой второй просмотр:

class CreateSchedule(views.UpdateView):
    """
    Schedule form
    """
    model = Group
    fields = []
    template_name = 'createschedule.html'

    def get_object(self, queryset=None):
        object = super(CreateSchedule, self).get_object(queryset)
        # if object.type == Group.TYPE_SINGLE:
        self.obj_object = Obj.objects.filter(group=object).first()
        return object

    def get_form(self, form_class=None):
        paymentschedule_formset = modelformset_factory(
            model=PaymentSchedule,
            form=PaymentScheduleForm,
            fields=('due_date', 'value'),
            validate_min=True,
            min_num=self.obj_object.number_of_payments,
            validate_max=True,
            max_num=self.obj_object.number_of_payments,
        )

        print(self.initial)
        return paymentschedule_formset(
            queryset=PaymentSchedule.objects.filter(obj=self.obj_object),
    )

    def get_context_data(self, **kwargs):
        context = super(CreateSchedule, self).get_context_data(**kwargs)
        if self.object.type == Group.TYPE_MULTIPLE:
            context['has_fifth_steps'] = True
            context['active_step'] = 5
        else:
            context['has_fifth_steps'] = False
            context['active_step'] = 4
        context['progress'] = 100
        return context

Не уверен, что я делаю что-то не так или это нормальное поведение, которое не имеет для меня особого смысла.

Спасибо за любую помощь!

Редактировать:

Добавлен urls.py

urlpatterns = [
path('create/<int:pk>/', sanad.CreateType.as_view(), name='create_obj.type'),
path('create/<int:pk>/payments-schedule', CreatesSchedule.as_view(), name='create_obj.schedule'),
]

1 Ответ

1 голос
/ 07 марта 2019

Вы никогда не должны изменять self.initial. Это словарь, определенный на уровне класса в FormMixin, который используется CreateView. Если вы изменяете это условие, это изменение видимо для всех представлений.

Ты не должен этого делать. В любом случае, изменение начального значения в пределах get_object - неправильная вещь. Вместо этого определите метод get_initial() для возврата нового словаря, содержащего это значение:

def get_initial(self):
    return {'old_type': self.object.type}

Теперь вам вообще не нужно переопределять get_object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...