Перенос данных с кнопки на бланк поста на следующей странице.Джанго - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь передать параметр get с предыдущей страницы, назначенной моей кнопке, на следующую страницу, добавить его в мою форму и сохранить в моей базе данных.Мой код выглядит так:

views.py

def massage_order(request):
    parametr_html_product_name = request.GET('parameter')
    if request.method == 'POST' and 'btn_massage_order' in request.POST:
        ordering_form = OrderingMassageForm(data=request.POST)
        if ordering_form.is_valid():
        massage_product = parametr_html_product_name
        [...]
    else:
        ordering_form = OrderingMassageForm()

templates.html

<a href="{% url 'app:massage_order' %}?parameter={{ product.name }}&parameter_1={{ product.price }}&parameter_2={{ product.time }}&parameter_3={{ masseur.name }}">
    <div class="btn-group btn-action-label" role="group" aria-label="Like">
        <div class="btn btn-sm btn-outline-primary btn-label">{{ product.price }} zł/ {{ product.time }} min</div>
        <button type="button" class="btn btn-sm btn-primary btn-action">
            <span>Zamów masaż</span>
        </button>
    </div>
</a>

Но якаждый раз получая ошибку 'Multi Value Dict Key Error' я нашел его решение parametr_html_product_name = request.GET.get('parameter', False), но в этой ситуации моей переменной является False, а не название продукта (что он ожидает).Как я могу передать переменную «html имя продукта параметра» в мою форму?Я пытался добавить его в список (тоже без положительного эффекта).Мы будем благодарны за любую помощь.

Почему, несмотря на добавление переменной в список Django, она не отображается в моей форме?

list = [parametr_html_masseur_name, parametr_html_product_name]

[...]
massage_product = list[1]
[...]

РЕДАКТИРОВАТЬ

templates.html

<form action="." method="post">
    <input type="hidden" name="name" value="{{ product.name }}">
    <input type="hidden" name="name" value="{{ product.price }}">
    <input type="hidden" name="name" value="{{ product.time }}">
    {% csrf_token %}
    <div class="btn-group btn-action-label" role="group" aria-label="Like">
        <div class="btn btn-sm btn-outline-primary btn-label">{{ product.price }} zł/ {{ product.time }} min</div>
        <button type="submit" name="hidden_btn" class="btn btn-sm btn-primary btn-action">
        <span>Zamów masaż</span>
        </button>
    </div>
</form>

forms.py

class HiddenOrderingMassageForm(forms.Form):
    product_name = forms.CharField(widget=forms.HiddenInput)
    price = forms.IntegerField(widget=forms.HiddenInput)
    time = forms.IntegerField(widget=forms.HiddenInput)

views.py

if request.method == 'POST' and 'hidden_btn' in request.POST:
    hidden_form = HiddenOrderingMassageForm(request.POST)
    if hidden_form.is_valid():
        product_name = hidden_form.cleaned_data['product_name']
        return HttpResponseRedirect(reverse('app:massage_order', args=[product_name]))
else:
    hidden_form = HiddenOrderingMassageForm()

urls.py

url(r'^massage_order/(?P<text>[\w\-]+)/$', views.massage_order, name='massage_order')

1 Ответ

0 голосов
/ 19 февраля 2019

В вашем текущем коде вы используете GET (так как все заключено в тег <a>), но вы ожидаете, что значения будут в request.POST.Я думаю, что лучший способ сделать это - использовать форму со скрытыми входными данными со всеми необходимыми значениями и проверять их на бэкэнде, как вы это делаете с формой.Таким образом, вместо использования a, измените на что-то следующее:

<form action="{% url 'app:massage_order' %}" method="post">
    <input type="hidden" name="name" value="product_name">
    ...
    {% csrf_token %}
    <div class="btn-group btn-action-label" role="group" aria-label="Like">
        <div class="btn btn-sm btn-outline-primary btn-label">{{ product.price }} zł/ {{ product.time }} min</div>
        <button type="button" class="btn btn-sm btn-primary btn-action">
            <span>Zamów masaż</span>
        </button>
    </div>
</form>

Или вместо создания формы вручную в шаблоне, вы можете указать OrderingMassageForm, в котором будут установлены виджеты всех полейк скрытому вводу, то есть:

class HiddenOrderingMassageForm(forms.Form):
    product_name = forms.CharField(widget=forms.HiddenInput)

, а затем вставьте в шаблон обычным способом:

<form action="{% url 'app:massage_order' %}" method="post">
    {{ hidden_form }}
    {% csrf_token %}
    <div class="btn-group btn-action-label" role="group" aria-label="Like">
        <div class="btn btn-sm btn-outline-primary btn-label">{{ product.price }} zł/ {{ product.time }} min</div>
        <button type="button" class="btn btn-sm btn-primary btn-action">
            <span>Zamów masaż</span>
        </button>
    </div>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...