Django: получить раскрывающееся значение и выбрать динамические поля формы для представлений на основе классов - PullRequest
0 голосов
/ 28 июня 2019

В моем текущем коде (см. Ниже) я получаю выбранное значение из выпадающего списка, например, значение «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>

1 Ответ

1 голос
/ 28 июня 2019

Я думаю, вы можете подойти так:

Я переопределяю метод get_form_class, чтобы решить, какую форму визуализировать между HamburgerForm и PancakeForm. Затем я передаю CookingForm в качестве контекста в методе get_context_data.

class CookingView(FormView):
    template_name = 'form/cooking.html'
     success_url = '/some_url/'

    def get_form_class(self):
       recipe_choice = self.request.GET.get('recipe_select', '1')
       if recipe_choice == '1':
        return HamburgerForm
       elif recipe_choice == '2':
        return PancakeForm

    def get_context_data(self, **kwargs):
        context = super(CookingView, self).get_context_data(**kwargs)
        context['cookbook_form'] = CookingForm()
        return context

И я также обновляю шаблон (используя form вместо ingridients_form).

{% 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 form %}
  </form>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...