невозможно вставить форму в шаблон: объект ‘WSGIRequest’ не имеет атрибута ‘get’

#django #forms #django-forms

#django #формы #django-forms

Вопрос:

Я пытаюсь вставить форму в шаблон и получаю сообщение об ошибке ‘WSGIRequest’ объект не имеет атрибута ‘get’я не понимаю

моя форма (форма счета) основана на модели (Заказы), и я просто хочу отобразить одно из его полей (split_bill) в моем шаблоне индекса, который представляет собой таблицу

Я искал эту ошибку в документации и здесь, в stackoverflow, но не понял проблему…

forms.py

 class BillForm(forms.ModelForm):

    class Meta:
        model = Orders
        fields = ['split_bill',]
 

views.py

 def index(request):
 
    orders = Orders.objects.filter(paid = False) # only ongoing orders (not paid)
    if request.method == "POST":
        billform = BillForm(request, data=request.POST or None)
        if billform.is_valid():
            billform.save()
        return redirect('home')
    else:
        billform = BillForm(request) 

    return render(request, 'cafe/index.html', {'orders':orders,'billform':billform,})
 

index.html

 <div class='container'>
    <h1>Dashboard</h1>
    <table id="table_id" class="table  table-stripped table-hover" style="width:100%">
        <thead>
            <tr>
                <th>Order</th>
                <th>Table</th>
                <th>Date</th>
                <th>Served</th>
                <th>Bill</th>
                <th>Paiment</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
        {% for order in orders %}

                <tr>
                    <td data-toggle="tooltip" data-placement="top" title="">
                        {{ order.order_id }}
                    </td>
                    <td data-toggle="tooltip" data-placement="top" title="">
                        {{ order.table_id }}
                    </td>
                    <td data-toggle="tooltip" data-placement="top" title="">
                        {{ order.created_at|date:"D, d M, Y" }}
                    </td>
                    <td data-toggle="tooltip" data-placement="top" title="">
                        {% if order.delivered %}
                            <a style="margin-right: 40px;color:black;" data-order="{{ order.order_id }}" class="served" href="#"><i class="fa fa-check-square" aria-hidden="true"></i></a>
                        {% else %}
                            <a style="margin-right: 40px;color:black;" data-order="{{ order.order_id }}" class="served" href="#"><i class="fa fa-square-o" aria-hidden="true"></i></a>
                        {% endif %}
                    </td>
                    <td data-toggle="tooltip" data-placement="top" title="">
                    <form id="bill" method="POST" class="post-form" data-order="{{ order.order_id }}">
                        {% csrf_token %}
                        {{ billform|crispy }}
                    <form>
                    </td>
                    <td data-toggle="tooltip" data-placement="top" title="">
                        <a style="margin-right: 40px;color:black;" data-order="{{ order.order_id }}" class="paiement" href="#"><i class="fa fa-cc-mastercard"></i></a>
                    </td>
                    <td data-toggle="tooltip" data-placement="top" title="">
                        <a style="margin-right: 40px;color:black;" data-target="" class="" href="{% url 'cafe:update_order' order.order_id %}"><i class="fa fa-pencil"></i></a>
                        <a style="margin-right: 40px;color:black;" data-target="" class="" href="#"><i class="fa fa-trash"></i></a>
                    </td>
                </tr>

        {% endfor %}
        </tbody>
    </table>
</div>

{% endblock %}
 

Ответ №1:

Вы не передаете a request в a ModelForm , вы передаете в качестве первого параметра data=… параметр, поэтому вы создаете форму без параметров для запроса GET и с request.POST и request.FILES для запроса POST:

 def index(request):
    orders = Orders.objects.filter(paid=False)
    if request.method == 'POST':
        #            no request ↓
        billform = BillForm(request.POST, request.FILES)
        if billform.is_valid():
            billform.save()
        return redirect('home')
    else:
        billform = BillForm()   # ← no request

    return render(request, 'cafe/index.html', {'orders':orders,'billform':billform,}) 

Некоторые люди действительно переопределяют __init__ метод, чтобы разрешить запрос и выполнить дальнейшую обработку с этим, но ванильный ModelForm не принимает запрос в качестве параметра.