我想传递两个参数给我的view函数,以便从表中删除特定的记录。
有一个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>正如你所看到的,我想从超文本标记语言模板向我的函数传递两个参数( Meal的主键和我想从Meals.ingredient中删除的产品名称)。
但在同一时间,URL模式正在接收2个参数,当它只需要一个参数时,它会尝试基于这两个参数生成指向网站的链接。我甚至试图通过传递HttpResponse(status=204)来强制函数停留在同一页上。
如何排除从HTML传递到urls.py的参数之一,或者是否有其他方法可以将变量从html模板传递到视图函数?
发布于 2020-02-05 07:04:35
您应该在您的remove_ingredient网址中使用re_path,并且还应考虑对网址进行描述性说明,以便用户可以看到该操作。
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保护。
您不希望系统中更改数据的内容暴露&如果有人发现可以从您的web应用程序外部请求的URL来更改您的数据,则容易受到攻击。
这里有更多关于这方面的阅读;https://softwareengineering.stackexchange.com/questions/188860/why-shouldnt-a-get-request-change-data-on-the-server
https://stackoverflow.com/questions/60066254
复制相似问题