I know that Django supports GET and POST methods in forms, but how can I make some forms use PUT or DELETE methods?
For example, this form which redirects to listing-delete view.
templates\partials\listings\detail\head.html:
{# Head #}
{% if request.user.is_authenticated and listing.poster == request.user %}
<div class="d-flex justify-content-between mb-3">
{# 4 Authentication & authorization #}
<form action="{% url 'listing-delete' listing %}" method="post">
{# Add DELETE method #}
{# 3 CSRF tokens #}
{% csrf_token %}
<div class="btn-group" role="group">
<a class="btn btn-secondary fw-semibold" href="{% url 'listing-update' listing %}">Izmeni</a>
<button class="btn btn-danger fw-semibold" type="submit">Obriši</button>
</div>
</form>
</div>
{% endif %}
realestate\listings\urls.py:
urlpatterns = [
path("", views.llist, name="listing-list"),
path("/pretraga", views.search, name="listing-search"),
path("/<int:listing>", views.detail, name="listing-detail"),
# 4 Authentication & authorization
path("/postavka", views.create, name="listing-create"),
# path("/postavka", login_required(views.create), name="listing-create"),
path("/izmena/<int:listing>", login_required(views.update), name="listing-update"), # PUT
path("/brisanje/<int:listing>", login_required(views.delete), name="listing-delete"), # DELETE
path("/cuvanje/<int:listing>", login_required(views.bookmark), name="listing-bookmark"),
]
delete deletes listing and its terms obviously. No need to explain the inside services.
listings\views.py:
def delete(request: HttpRequest, listing: Listing):
# 4 Authentication & authorization
user = CustomUser(request.user)
# 6 Error handling
if user == listing.poster:
terms = listing.terms
listing_serv.delete(listing)
terms_serv.delete(terms)
# 5 Security logging
logger.info(log_messages.listing_view["delete"], extra={"context": {"user_id": user.pk, "terms_id": terms.pk, "listing_id": listing.pk}})
return redirect(reverse("listing-detail"))
# 5 Security logging
logger.info(log_messages.listing_view["delete__forbidden"], extra={"context": {"listing_id": listing.pk}})
return HttpResponseForbidden()