#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 (запрос. ОПУБЛИКОВАТЬ, запросить. ФАЙЛЫ, экземпляр = безопасность, модель= модель, которую я хочу использовать). Я уже пробовал, но это не работает 🙂