如何在 Django 中删除条目?

34 浏览
0 Comments

如何在 Django 中删除条目?

这是一个小的Django项目,它有创建主题、创建和编辑帖子的方法。

我不知道如何编写一个删除主题中帖子的方法。

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

我尝试添加delete_entry()函数,但它不起作用。

admin 更改状态以发布 2023年5月24日
0
0 Comments

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 or None
            return redirect('composetopic:topic', topic_id=topic_id) # deleted id
    context = {'topic': topic, 'form': form} #  topic or None
    return render(request, 'composetopic/deleted_entry.html', context)

如果已正确删除(id存在且对象已验证),主题应返回一个空的查询集实例,如果不是,则只需设置为None

from app.models import Topic
>>> Topic.objects.all()

#...
>>> topic = Topic.objects.get(id = id)
>>> topic.delete()
 # You can still access to his attributes but this not exist in database

如果id对象无效,则会引发一个错误self.model.DoesNotExists,然后在调用get方法时使用try-except语句,还需要在检查请求类型("POST","GET")时修改如何和在哪里重定向已删除的对象或像渲染一个带有文本“已删除主题”和一些关于删除对象的信息的页面。

0