django - 如何更改视图中表单的底层模型?
问题描述
我有一个小型 Django 应用程序,我想管理两个股票投资组合。我创建了两个具有相同结构(基于抽象模型)的表(SecuritiesSVR 和 SecuritiesAHT)。在网址中,我添加了一个参数“ptf”:portfolio/str:ptf/change_position
我还创建了一个表格来更新表格:
class SecuritiesUpdateForm(forms.ModelForm):
class Meta:
model = model is dependent on parameter in url
fields = ['opinions', 'remarks']
现在我正在寻找一种方法来根据 url 中的参数更改表单的底层模型:
def change_position(request, ptf, symbol):
if ptf == 'aht':
Securities = SecuritiesAHT
if ptf == 'svr':
Securities = SecuritiesSVR
security = Securities.objects.get(pk=symbol)
if request.method == 'POST':
u_form = SecuritiesUpdateForm(request.POST, request.FILES, instance=security)
if u_form.is_valid():
u_form.save()
messages.success(request, f'Security has been updated!')
return redirect('portfolio:portfolios', ptf=ptf)
else:
u_form = SecuritiesUpdateForm(instance=security)
context = {
'u_form': u_form,
'ptf': ptf
}
return render(request, 'portfolio/change_position.html', context)
是否可以在视图中设置表单需要使用的模型?
解决方案
我会这样做:
class CommonSecuritiesUpdateForm(forms.ModelForm):
... define all needed methods that is common for both classes
class SecuritiesAHTUpdateForm(CommonSecuritiesUpdateForm):
class Meta:
model = SecuritiesAHT
fields = ['opinions', 'remarks']
class SecuritiesSVRUpdateForm(CommonSecuritiesUpdateForm):
class Meta:
model = SecuritiesSVR
fields = ['opinions', 'remarks']
并且在视野中
def change_position(request, ptf, symbol):
if ptf == 'aht':
form_class = SecuritiesAHTUpdateForm
if ptf == 'svr':
form_class = SecuritiesSVRUpdateForm
security = Securities.objects.get(pk=symbol)
if request.method == 'POST':
u_form = form_class(request.POST, request.FILES, instance=security)
if u_form.is_valid():
u_form.save()
messages.success(request, f'Security has been updated!')
return redirect('portfolio:portfolios', ptf=ptf)
else:
u_form = form_class(instance=security)
context = {
'u_form': u_form,
'ptf': ptf
}
return render(request, 'portfolio/change_position.html', context)
推荐阅读
- reactjs - 下拉项在第一次尝试时未进行 api 调用
- linux - IMA 无法检测到现有的 TPM,即使它存在并正常运行
- reactjs - 我们可以使用带有 PrimeReact 按钮的 Material Icon
- java - 二进制文件的迭代器
- javascript - 在输入表中添加或删除行以及一些可用的 Jinja
- python - 如何从 tkcalendar.Calendar 中的 get_date 方法获取 4 位数年份或日期/日期时间对象的日期?
- reactjs - 如何在 React 中渲染动态表格
- java - 将 ReadableByteChannel 保存为 PNG
- tiptap - 提示如何在 Shift-Enter 上创建段落 (p),而不是 br?
- java - Java 8流按多个属性和总和分组