2014-09-24 54 views
0

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

这里是我的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。删除链接将读取所有提交的“/ delete/1”,因此只允许用户删除他们的第一次提交。有关我如何解决这个问题的任何想法?

回答

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列表。

+0

谢谢,在'for obj in favorites_list'之前放置列表工作。但是,现在我得到多个删除链接。每个ID都有一个。 – ng150716 2014-09-24 21:05:25

+0

正确,这就是你的模板代码正在做什么..请参阅带'a'标签的for循环? – karthikr 2014-09-24 21:06:33

+0

啊,是的,我明白了。但是,当我在模板中取出'for'循环,并尝试通过{{stock_id}}时,删除链接将在其中和括号中包含所有标识,例如:“/ delete/[11,12]”任何方式来对付这个? – ng150716 2014-09-24 21:09:24