首页 > 解决方案 > 如何更改视图中表单的底层模型?

问题描述

我有一个小型 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)

是否可以在视图中设置表单需要使用的模型?

标签: django

解决方案


我会这样做:

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)

推荐阅读