0

В настоящее время я использую модели, чтобы пользователи вводили данные с помощью шаблонов (а не admin), которые затем сохраняются, после чего пользователи могут видеть все данные, которые они ввели. Я также хотел бы предоставить пользователям возможность удалять определенные записи, это было бы сделано с помощью идентификаторов объектов для идентификации и удаления определенных объектов.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 - 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 

Кроме того, в вашем методе удаления - Смотрите, если пользователь имеет разрешение на удаление объекта. Если нет, любой может ударить этот URL с некоторым случайным идентификатором и начать удалять объекты в базе данных.

Я хотел бы начать путем добавления login_required декоратора, с последующим добавлением created_by или прикрепления group, связанный с моделью, которые необходимо проверить, прежде чем разрешить пользователю удалить объект.

EDIT

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

Теперь вы можете избавиться от списка идентификаторов.

+0

Благодарим вас, разместив список до того, как «для obj в избранном_list» работал. Однако теперь я получаю несколько ссылок на удаление. Один для каждого идентификатора. – ng150716

+0

Правильно, это то, что делает ваш код шаблона. См. Цикл for с тегами 'a'? – karthikr

+0

Ах да, я вижу. Но когда я беру цикл «for» в своем шаблоне и просто пытаюсь передать {{Stock_id}}, ссылки на удаление имеют все идентификаторы в нем и в скобках, например: «/ delete/[11,12]», Любой способ борьбы с этим? – ng150716