В моем текущем коде (см. Ниже) я получаю выбранное значение из выпадающего списка, например, значение «1».
recipe_choice = request.GET.get('recipe_select', False)
Я использую это значение в логике ЕСЛИ для выбора среди различных форм, таких как
if recipe_choice == '1':
ingredients_form = HamburgerForm(request.POST)
Затем я возвращаю Контекст, который состоит из моего выпадающего поля выбора и выбранной формы.
Все работает нормально, когда я вызываю его как функцию и могу использовать «Запрос», чтобы извлечь мой выпадающий выбор как GET.
например. как функция:
path('cooking/', cooking, name="cooking")
Однако я хотел бы спросить, как я могу получить тот же результат при использовании ClassView FormView, например:
path('cooking/', CookingView.as_view(), name="cooking")
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу извлечь выбранное значение из раскрывающегося списка и не могу найти его в get_context_data, чтобы использовать его в выражении IF, поэтому не могу перевести мою старую функцию в новый CookingView (FormView):
class CookingView(FormView):
form_class = CookingForm
template_name = 'form/cooking.html'
def get_context_data(self, **kwargs):
"""
# some logic to get a desired form, such as
ingredients_form = []
if recipe_choice == '1':
ingredients_form = HamburgerForm(request.POST)
elif recipe_choice == '2':
ingredients_form = PancakeForm(request.POST)
"""
context = super(CookingView, self).get_context_data(**kwargs)
context['ingridients_form'] = ingredients_form
return context
В: Как мне получить эту логику в FormView FormView?
Ниже я предоставляю свой текущий код, который работает (как функция).
views.py
def cooking(request):
context = {}
recipe_choice = request.GET.get('recipe_select', False)
ingredients_form = []
if recipe_choice == '1':
ingredients_form = HamburgerForm(request.POST)
elif recipe_choice == '2':
ingredients_form = PancakeForm(request.POST)
context['cookbook_form'] = CookingForm(request.GET or None)
context['ingridients_form'] = ingredients_form
return render(request, 'form/cooking.html', context)
models.py
class Ingridients(models.Model):
# for hamburgers
cheese = models.IntegerField(default=0)
ham = models.IntegerField(default=0)
onion = models.IntegerField(default=0)
bread = models.IntegerField(default=0)
ketchup = models.IntegerField(default=0)
# for pancakes
milk = models.IntegerField(default=0)
butter = models.IntegerField(default=0)
honey = models.IntegerField(default=0)
eggs = models.IntegerField(default=0)
forms.py
class CookingForm(Form):
RECIPES = (
(1, 'Hamburger'),
(2, 'Pancakes')
)
recipe_select = ChoiceField(choices=RECIPES)
class HamburgerForm(forms.ModelForm):
class Meta:
model = Ingridients
fields = ['cheese', 'ham', 'onion', 'bread', 'ketchup']
class PancakeForm(forms.ModelForm):
class Meta:
model = Ingridients
fields = ['milk', 'butter', 'honey', 'eggs']
cooking.html
{% load crispy_forms_tags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form id="cookselect_form" method="GET">
{{ cookbook_form|crispy }}
<div class="btn-group btn-group-justified" role="group">
<div class="btn-group" role="group">
<button class="btn btn-primary" type="submit">Choose Recipe</button>
</div>
</div>
</form>
<form id="ingridientslist_form" method="POST">
{% csrf_token %}
{% crispy ingridients_form %}
</form>
</body>
</html>