0

there is a small django project that has methods for creating a topic, creating and editing posts within it.

I don't understand how to write a method to delete a post in a topic

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Topic, Entry
from .forms import TopicForm, EntryForm
from django.http import Http404




@login_required()
def new_entry(request, topic_id):
    topic = Topic.objects.get(id=topic_id)
    check_topic_owner(topic.owner, request)
    if request.method != "POST":
        form = EntryForm()
    else:
        form = EntryForm(data=request.POST)
        if form.is_valid():
            new_entry = form.save(commit=False)
            new_entry.topic = topic
            new_entry.save()
            return redirect('composetopic:topic', topic_id=topic_id)

    context = {'topic': topic, 'form': form}
    return render(request, 'composetopic/new_entry.html', context)


@login_required()
def edit_entry(request, entry_id):
    entry = Entry.objects.get(id=entry_id)
    topic = entry.topic
    check_topic_owner(topic.owner, request)

    if request.method != "POST":
        form = EntryForm(instance=entry)
    else:
        form = EntryForm(instance=entry, data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('composetopic:topic', topic_id=topic.id)

    context = {'entry': entry, 'topic': topic, 'form': form}
    return render(request, 'composetopic/edit_entry.html', context)


def check_topic_owner(owner, request):
    if owner != request.user:
        raise Http404

i was tried to add delete_entry() function, but its not working

vdkmvx
  • 11
  • 1

1 Answers1

0
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Topic, Entry
from .forms import TopicForm, EntryForm
from django.http import Http404

@login_required()
def delete_entry(request, topic_id):
    try:
        topic = Topic.objects.get(id=topic_id) 
        topic.delete()
    except Topic.DoesNotExist as e:
        topic = None

    if request.method != "POST":
        form = EntryForm()
    else:
        form = EntryForm(data=request.POST)
        if form.is_valid():
            new_entry = form.save(commit=False)
            new_entry.topic = topic # <Topic: Topic object (None)> topic or None
            return redirect('composetopic:topic', topic_id=topic_id) # deleted id

    context = {'topic': topic, 'form': form} # <Topic: Topic object (None)> topic or None
    return render(request, 'composetopic/deleted_entry.html', context)

topic should return a null queryset instance if has beed deleted correctly (id exist and object is validated) if is not is just set to None

from app.models import Topic
>>> Topic.objects.all()
<QuerySet [. . .]>
#...
>>> topic = Topic.objects.get(id = id)
>>> topic.delete()
<Topic: Topic object (None)> # You can still access to his attributes but this not exist in database

if id object is not valid, raise an error self.model.DoesNotExists then a try-except statement is used when you call get method, also when you check for type of request ("POST", "GET") you need to modify how and where redirect deleted objects or something like render a page with text 'deleted topic' and some information about deleted object.

user11717481
  • 1
  • 9
  • 15
  • 25