Django предава 2 параметъра от HTML шаблон към функцията за изгледи

Искам да предам 2 параметъра на моята функция за изглед, за да изтрия конкретен запис от таблицата.

Има M2M връзка, върху която искам да работя, така че трябва да предам 2 параметъра за 2 различни обекта.

Модел:

class Products(models.Model):
     name = models.CharField(max_length=50)
     price = models.DecimalField(max_digits=100, decimal_places=2, blank=True)

class Meals(models.Model):
     name = models.CharField(max_length=40)
     ingredient = models.ManyToManyField(Products, related_name="products")

гледания:

def remove_ingredient(request, pk, name):
     meal = Meals.objects.get(pk=pk)
     prod = Products.objects.get(name=name)
     meal.ingredient.remove(prod)
     return HttpResponse(status=204)

URL модели:

urlpatterns = [ 
    path("meal_detail/<int:pk>/",MealDetailView.as_view(), name="meal_detail" ),
    path("meal_detail/<int:pk>/", remove_ingredient, name="remove_ingredient")
]

HTML шаблон:

 <a class="hyperlink-off" href="/bg{% url 'remove_ingredient' pk=object.pk  name=ingredient.name %}">
       Remove
 </a>

Както можете да видите, искам да предам 2 аргумента от HTML шаблон към моята функция (първичен ключ на Meal и име на продукта, който искам да премахна от Meals.ingredient).

Но в същото време URL моделът получава 2 аргумента и се опитва да генерира връзка към уебсайт въз основа на двата, когато се нуждае само от един. Опитах се дори да принудя функцията да остане на същата страница, като предадох HttpResponse(status=204).

Как мога да изключа един от аргументите, предадени от HTML към urls.py, или има ли друг начин за предаване на променливи към функцията за изгледи от html шаблон?


person Piotr    schedule 04.02.2020    source източник


Отговори (1)


Трябва да използвате re_path във вашия remove_ingredient URL, а също помислете дали URL адресът е описателен, така че действието да е видимо за потребителя.

urlpatterns = [ 
    path("meal_detail/<int:pk>/", MealDetailView.as_view(), name="meal_detail" ),
    re_path("^meal_detail/<int:pk>/remove/(?P<name>\w+)/$", remove_ingredient, name="remove_ingredient")
]

Друго нещо, което трябва да имате предвид е, че действие, което променя състоянието на вашето приложение, напр. променя данните в базата данни като тази, наистина трябва да се направи като POST заявка, защото това ви позволява да използвате функциите за сигурност на django като CSRF защита.

Не бихте искали нещо, което променя данните във вашата система, да бъде изложено и уязвимо за атака, ако някой открие URL адрес, който може да бъде поискан извън вашето уеб приложение, за да промени вашите данни.

Тук има допълнително четене по този въпрос; https://softwareengineering.stackexchange.com/questions/188860/why-shouldnt-a-get-request-change-data-on-the-server

person markwalker_    schedule 04.02.2020