Django передача 2 параметров из шаблона HTML в функцию views - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу передать 2 параметра моей функции просмотра, чтобы удалить указанную c запись из таблицы.

Существует соединение 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="{% 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 шаблона?

1 Ответ

0 голосов
/ 05 февраля 2020

Вы должны использовать 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

...