dan*_*ana 22 forms django object django-views
在迷你博客应用程序中,我想创建一个删除功能,以便博客的所有者可以删除他的条目(只有他的条目).我想这样做的唯一方法是使用表单.虽然我的删除代码似乎清晰正确,但它不起作用.我的代码:
def delete_new(request,id):
u = New.objects.get(pk=id).delete()
if request.method == 'POST':
form = DeleteNewForm(request.POST)
form.u.delete()
form.save()
return render_to_response('news/deleteNew.html', {
'form': form,
},
context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
并在模板中:
<a href='/news/delete_new/{{object.id}}/'> Delete</a> <br />
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我的意思是,为此创建一个表单?另外,获取与删除链接相关联的博客文章的唯一方法是将id作为参数.这样对吗?我的意思是,也许任何用户都可以在网址中键入另一个ID,并删除另一个条目(最终不是他的一个)
Wil*_*hes 30
您需要使用表单,否则您很容易受到CSRF攻击.在检查请求是GET还是POST之前,您还要删除模型.
创建一个简单的ModelForm:
from django import forms
from .models import New
class DeleteNewForm(forms.ModelForm):
class Meta:
model = New
fields = []
Run Code Online (Sandbox Code Playgroud)
在您的views.py中,在相同的Django应用程序中:
from django.shortcuts import render, get_object_or_404
from .forms import DeleteNewForm
from .models import New
def delete_new(request, new_id):
new_to_delete = get_object_or_404(New, id=new_id)
#+some code to check if this object belongs to the logged in user
if request.method == 'POST':
form = DeleteNewForm(request.POST, instance=new_to_delete)
if form.is_valid(): # checks CSRF
new_to_delete.delete()
return HttpResponseRedirect("/") # wherever to go after deleting
else:
form = DeleteNewForm(instance=new_to_delete)
template_vars = {'form': form}
return render(request, 'news/deleteNew.html', template_vars)
Run Code Online (Sandbox Code Playgroud)
dzi*_*ida 20
通常,对于删除对象,您应该使用POST(或DELETE)HTTP方法.
如果您真的想在您的示例中使用HTTP GET,那么您需要修复以下内容:
如果你有url指向你的某个url:<a href='/news/delete_new/{{object.id}}/'> Delete</a>那么你可以简单地编写一个视图,检查对象是否属于登录用户,如果是,则删除此条目,就像你已编写的代码一样:
def delete_new(request,id):
#+some code to check if New belongs to logged in user
u = New.objects.get(pk=id).delete()
Run Code Online (Sandbox Code Playgroud)
要检查新对象是否属于某些用户,您需要在User和之间创建realation New(如created_by = models.ForeignKey(User)在New模型中).
您可以通过以下方式登录用户: request.user
我希望我能正确理解你的观点,我的回答会以某种方式帮助你.
PS:您还可以考虑使用{% url %}标记而不是直接在模板中编写网址.