0

현재 모델을 사용하여 사용자가 데이터를 입력하고 저장하지 않는 템플릿 (관리자가 아닌)을 사용하면 사용자가 입력 한 모든 데이터를 볼 수 있습니다. 또한 사용자에게 특정 항목을 삭제할 수있는 기능을 제공하고 싶습니다. 특정 개체를 식별하고 삭제하기 위해 개체 ID를 사용하여 수행 할 수 있습니다. 여기 Django : 템플릿을 사용하여 모델 객체 삭제

@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입니다 : 여기

내 views.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) 

. 사용자가 개체를 삭제할 수있는 권한을 가지고 있는지 확인 -

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 

또한, 귀하의 삭제 방법 :

당신도 할 수있는이

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

참고하십시오. 그렇지 않은 경우, 누군가는 임의의 ID로이 URL을 치고 데이터베이스의 오브젝트를 삭제하기 시작할 수 있습니다.

나는 created_by를 추가하거나 사용자가 개체를 삭제할 수 있도록하기 전에 확인해야 할 모델과 관련된 group를 부착 다음에 login_required 장식을 추가하여 시작합니다.

편집

{% 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

+0

올바른지, 그것은 템플릿 코드가하는 일입니다 ..'a' 태그로 for 루프를 보시겠습니까? – karthikr

+0

아, 네, 알겠습니다. 그러나 템플릿의 'for'루프를 꺼내서 {{stock_id}}을 전달하려고하면 삭제 링크의 모든 ID가 대괄호로 묶입니다 (예 : "/ delete/[11,12]"). 이것과 싸울 방법이 있습니까? – ng150716

관련 문제