Django:使用模板删除模型对象

时间:2014-09-24 20:51:32

标签: python django django-models django-forms django-templates

我目前正在使用模型让用户使用随后存储的模板(而非管理员)输入数据,然后用户可以看到他们输入的所有数据。我还希望用户能够删除特定条目,这可以使用对象ID来识别和删除特定对象。

这是我的views.py:

@login_required(login_url='/login/')
def fav(request):
    context = RequestContext(request)

    #This returns all of the data the user has entered
    favorites_list = StockTickerSymbol.objects.filter(user=request.user).order_by('-added_date')
`
    #This is to try to get the ID of every object in favorites_list and append it to a list
    for obj in favorites_list:
        stock_id = []
        stock_id.append(obj.id)

    #Here is where the form is processed to save the data the user has entered
    if request.method == 'POST':
        form = FavoritesForm(request.POST)
        if form.is_valid(): 
            stock = form.save(commit=False)
            stock.user = request.user
            stock.save()
            return redirect(fav)    
        else:   
            print form.errors
    else: 
        form = FavoritesForm()

    context_dict = {'favorites': favorites_list, 'form':form, 'stock_id':stock_id}
    return render_to_response('favorites/favorites.html', context_dict, context)

def delete(request, id):
    stock_to_delete = get_object_or_404(StockTickerSymbol, pk=id).delete()
    return redirect(fav)

这是我的urls.py:

url(r'^favorites/$', views.fav, name='favorites'),
url(r'^add_favorites/$', views.add_fav, name='add favorites'),
url(r'^delete/(?P<id>\d+)/$', views.delete, name='delete')

这是我的模板文件的一部分,负责删除

{% for id in stock_id %}
    <div align="right"><a href="/delete/{{id}}">Delete</a></div>
{% endfor %}

我对这段代码的问题是,我模板中的删除链接只给出了所有链接的第一个对象ID。例如,如果用户有三个提交,那么id为1,2,3。删除链接将显示&#34; / delete / 1&#34;对于所有提交,因此只允许用户删除他们的第一次提交。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

你的问题在这里:

for obj in favorites_list:
    stock_id = []
    stock_id.append(obj.id)

你正在循环中重新初始化。

试试这个

stock_id = []
for obj in favorites_list:
    stock_id.append(obj.id)

请注意,您也可以这样做:

favorites_list = StockTickerSymbol.objects.filter(user=request.user).order_by('-added_date')
stock_ids = list(facorites_list.values_list('id', flat=True)) #IMO - It is a good idea to name a list with plural for readability

此外,在您的删除方法中 - 查看用户是否有权删除该对象。如果没有,任何人都可以使用一些随机ID来访问此URL并开始删除数据库中的对象。

我首先添加login_required装饰器,然后添加created_by或附加与模型关联的group,在允许用户删除之前需要进行验证物体。

修改

{% for fav in favorite_list %}
    <div class="fav">
         {{fav.name}}
    </div>
    <a href="/delete/{{fav.id}}">Delete me</a>
{% endfor %}

现在你可以取消id列表了。