django - Django UpdateView 初始参数传递给其他 UpdateView 的
问题描述
我有两个使用不同 url 访问的更新视图。在第一个更新视图CreateType
中,我在初始调用中设置了一个变量old_type
。在我提交并浏览其他视图后,我最终进入了我的第二个 UpdateView CreateSchedule
。如果我在我的第二个视图中打印 self.initial,我会发现old_type
出于某种原因在我的第一个 UpdateView 中设置的 var。
第一视角
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'),
]
解决方案
你永远不应该修改self.initial
. 那是在 FormMixin 中的类级别定义的字典,由 CreateView 使用。如果您修改该字典,则所有视图都可以看到该修改。
你不应该这样做。无论如何,在内部更改初始get_object
值是错误的。相反,定义get_initial()
方法以返回包含此值的新字典:
def get_initial(self):
return {'old_type': self.object.type}
现在您根本不需要覆盖get_object
。
推荐阅读
- android-studio - 如何在android studio中恢复gradle和java文件
- javascript - 修复图像尺寸/幻灯片
- assembly - 如何找到Assembly中描述中提到的以下函数F的第k项
- python - 如何在 Django REST Framework 中使用默认日期时间序列化?
- reactjs - 可反应加载的高阶组件
- zapier - Zapier 是否支持在触发器中进行轮询?
- sql - 将 TSQL 日期格式化为 mm-dd-yyyy
- java - Jackson JsonInclude.Include.NON_NULL 不适用于自定义序列化程序
- javascript - 将 ECDSA PEM 密钥导入浏览器进行签名
- c++ - 为什么使用 `declval` 定义`is_destructible`().~U()` 而不是 `declval ().~U()`?