Как изменить базовую модель для формы в представлении?

#django

#джанго #django

Вопрос:

У меня есть небольшое Django-приложение, в котором я хочу управлять двумя портфелями акций. Я создал две таблицы (SECURITIESVR и SecuritiesAHT) с одинаковой структурой (на основе абстрактной модели). В URL я добавил аргумент ‘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)
  

Есть ли возможность установить в представлении модель, которую должна использовать форма?

Комментарии:

1. Почему бы вам просто не создать две формы и не выбрать правильную из hte views.py ?

Ответ №1:

я бы сделал это таким образом:

 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)
  

Комментарии:

1. Большое спасибо! С другой стороны, я надеялся на решение типа u_form = form_class (запрос. ОПУБЛИКОВАТЬ, запросить. ФАЙЛЫ, экземпляр = безопасность, модель= модель, которую я хочу использовать). Я уже пробовал, но это не работает 🙂