#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
не принимает запрос в качестве параметра.