Reputation: 77
I have a small Django-app were I want to manage two stock portfolios. I created two tables (SecuritiesSVR and SecuritiesAHT) with the same structure (based on an abstract model). In the url I added an argument 'ptf' : portfolio/str:ptf/change_position
I also created a form to update the tables:
class SecuritiesUpdateForm(forms.ModelForm):
class Meta:
model = model is dependent on parameter in url
fields = ['opinions', 'remarks']
Now i'm searching for a way to change the underlying model for the form depending on the parameter in the 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)
Is there a possibility to set in the view the model that the form needs to use?
Upvotes: 0
Views: 31
Reputation: 1466
i would do it this way:
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']
and in view
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)
Upvotes: 2