stefvr
stefvr

Reputation: 77

How the change the underlying model for a form in a view?

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

Answers (1)

Andrey Maslov
Andrey Maslov

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

Related Questions