我是Python初学者(顺便说一句,也是英语初学者)。 我刚刚在Python / Django中创建了一个创建,编辑和删除项目的简单表单。 我有HTML链接,引用我的网址,如:
FILE.HTML:
<INPUT Type="BUTTON" VALUE="Edit" ONCLICK="window.location.href='/edit/{{ object.id }}/'">
URLS.PY:
url(r'^edit/(?P<id>\d+)/$', 'app.views.editobj'),
VIEWS.PY:
def editobj(request, id):
但是,当然,有一个问题,我不希望人们直接在URL上(只有点击按钮),因为有人可以只输入URL:/ removeobj / 1并删除对象ID = 1。我想要做的是创建不同的URL,也许是随机的,因此用户永远不会猜到按钮将打开的URL是什么,当然,它确实可以使用ID参数,所以当它是goind to edit /删除,打开正确的对象。 我希望我能清楚自己的需求。感谢。
答案 0 :(得分:1)
生成随机URL会非常低效,更不用说实施起来不必要了。做你要问的常用方法是POST到URL。我认为你应该多阅读一下Django POSTing,因为它可以帮助你更好地理解它的作用。无论如何,这是一个使用它的例子:
urls.py
url(r'^delete/$', 'app.views.delete_object', name="delete_obj"),
views.py
def delete_object(request):
""" Get the ID of an object via POST, then delete it. """
if request.method == 'POST' # This makes sure the request is a POST
obj_id = request.POST['obj_id']
obj = MODELNAME.objects.get(id=obj_id) # Use your model name here
# You can use if conditions here to make sure the object you just
# retrieved is allowed to be deleted by this user, or in general.
obj.delete()
messages.success(request, 'Object successfully deleted!')
return redirect(reverse('index')) # Make sure you use a name that exists
html的
<form method="POST" action="{% url 'delete_obj' %}">
{% CSRF_TOKEN %}
<input type="hidden" value="{{ obj.id }}" name="obj_id" />
<button type="submit">Submit</submit>
</form>
您可以在views.py中使用更多逻辑来确保允许该对象是可删除的,但是在大多数情况下,我编写的代码应该让您对创建POST的方式有所了解 - &GT;删除对象工作流程请随意在我的答案下面的评论部分提问。
答案 1 :(得分:0)
我看到做“随机”网址的最简单方法是为您的模型添加一个UUIDField(https://docs.djangoproject.com/en/1.8/ref/models/fields/#uuidfield或https://github.com/dcramer/django-uuidfield用于Django&lt; 1.8)。
您的网址可以成为
url(r'^delete/(?P<uuid>[\da-f-]+)', 'app.views.delete_object', name='delete_obj')
uuid几乎无法猜测。
现在,如果你没有添加额外的安全性来检查用户是否有来删除对象,那么任何人都可以运行一个机器人,它将遍历每一个可能的uuid并刷新你的数据库
如果只是一个不“猜测”的问题,@ Hybrid的解决方案可能是一个更好的起点。