【问题标题】:Django: Delete model object using templateDjango:使用模板删除模型对象
【发布时间】:2014-11-19 11:57:32
【问题描述】:

我目前正在使用模型让用户输入数据,使用然后存储的模板(不是管理员),此时用户可以看到他们输入的所有数据。我还想让用户能够删除特定条目,这将使用对象 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。例如,如果用户有 3 个提交,并且 id 是 1,2,3。所有提交的删除链接都将显示为“/delete/1”,因此只允许用户删除他们的第一个提交。关于如何解决这个问题的任何想法?

【问题讨论】:

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


    【解决方案1】:

    你的问题在这里:

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

    【讨论】:

    • 谢谢,将列表放在“for obj in favorites_list”之前有效。但是,现在我得到了多个删除链接。每个 ID 一个。
    • 正确,这就是您的模板代码正在做的事情。查看带有a 标签的for循环?
    • 啊,是的,我明白了。但是,当我在模板中取出“for”循环并尝试传递 {{ stock_id }} 时,删除链接的所有 id 都在其中和括号中,例如:“/delete/[11,12]”有什么办法可以解决这个问题?
    • 你想如何对抗它?
    • 无论如何只显示与每个模型对象相对应的 ID,而不是所有 ID
    猜你喜欢
    • 2011-07-22
    • 2011-09-28
    • 2016-06-05
    • 2023-03-23
    • 2014-01-09
    • 2016-06-11
    • 2014-09-07
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多