【问题标题】:When i delete or add an object in Django Admin it will not delete or add on the webpage?当我在 Django Admin 中删除或添加对象时,它不会在网页上删除或添加?
【发布时间】:2020-07-29 09:29:08
【问题描述】:

我试图创建一个简单的应用程序,它有一个类别列表,每个类别都有一个帖子列表。

当我在 Django Admin 中删除 Category 对象时,它会在 Admin 中消失,但仍会在模板中呈现。这是管理员只显示两个类别

但是,在 home.html 上显示 3..

为导航栏提供服务的 base.html 也显示 3

我已清除缓存并硬重新加载。 这是我的代码:

Views.py

from django.shortcuts import render, get_object_or_404
from .models import Post, Category
from django.views.generic import ListView, DetailView

category_list = Category.objects.all()

def privacy(request):
    return render (request, 'privacy.html', {'category_list':category_list})

def home(request):    
    return render(request,'home.html',{'category_list':category_list})

def categoryDetail(request, slug):
    category = get_object_or_404(Category, slug=slug)
    post = Post.objects.filter(category=category)
    return render(request,'category_detail.html',{'category':category, 'post':post, 'category_list':category_list})

和模板,home.html

{% if category_list %}

    <!-- Content Row -->
    <div class="row">
        {% for cat in category_list %}
      <div class="col-md-4 mb-5">
        <div class="card h-100">
          <div class="card-body">
            <h2 class="card-title"><a href="{% url 'category_detail' cat.slug %}">{{ cat.name }}</a></h2>
            <p class="card-text">{{ cat.summary|truncatechars:100 }}</p>
          </div>
          <div class="card-footer">
            <a href="{% url 'category_detail' cat.slug %}" class="btn btn-primary btn-sm">More Info</a>
          </div>
        </div>
      </div>
      {% endfor %}
    </div>
    <!-- /.row -->

{% else %}

<h3>COMING SOON ...</h3>

{% endif %}

base.html 中的类似

        <ul class="navbar-nav ml-auto">
{% for cat in category_list %}
          <li class="nav-item">
            <a class="nav-link" href="{% url 'category_detail' cat.slug %}">| {{cat.name}}</a>
          </li>
{% endfor %}
        </ul>

models.py

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=255)
    summary = models.TextField()
    slug = models.SlugField(max_length=255, unique=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    title= models.CharField(max_length=255)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

我关注了一个关于在 Views.py 中创建这些功能的视频,因为我希望能够在同一页面上显示类别的详细信息和其中的帖子列表......我有一种可怕的感觉错误是由于在函数之外定义 category_list...或更糟!

另外,是否需要在 base.html 中写一个函数来动态更新菜单选项?

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    这不是您的问题,您不需要添加自定义函数来让所有内容自行重新加载。事实上,Django 的批量删除方法实际上并没有调用delete() 方法。

    这仅适用于通过管理站点进行删除的情况;如果这发生在您的自定义模板中,则说明发生了其他事情。但你在这里很好。

    From the docs:

    “删除选定对象”操作出于效率原因使用 QuerySet.delete(),但有一个重要警告:您的模型的 delete() 方法将不会被调用。

    如果您希望覆盖此行为,只需编写一个自定义操作,以您喜欢的方式完成删除 - 例如,为每个选定的项目调用 Model.delete()。

    所以将这个添加到您的管理员中:

    class CategoryAdmin(admin.ModelAdmin):
        actions=['really_delete_selected']
    
        def get_actions(self, request):
            actions = super(CategoryAdmin, self).get_actions(request)
            del actions['delete_selected']
            return actions
    
        def really_delete_selected(self, request, queryset):
            for obj in queryset:
                obj.delete()
    
            if queryset.count() == 1:
                message_bit = "1 Category entry was"
            else:
                message_bit = "%s category entries were" % queryset.count()
            self.message_user(request, "%s successfully deleted." % message_bit)
        really_delete_selected.short_description = "Delete selected entries"
    
    admin.site.register(Entry, CategoryAdmin)
    

    Reference

    更新

    再次查看您的代码后,我发现了另一个漏洞。

    category_list = Category.objects.all()
    
    def home(request):    
        return render(request,'home.html',{'category_list':category_list})
    

    您必须将 category_list 用作局部变量——即在 home 函数内部。如果您在全局(外部)声明它,它不会响应更改,因为它每次运行只刷新一次。需要明确的是,它将是

    def home(request):    
        category_list = Category.objects.all()
        return render(request,'home.html',{'category_list':category_list})
    

    如果可行,请随时删除对管理仪表板所做的更改。似乎删除的东西在某些情况下是一个实际问题。

    【讨论】:

    • 我将您的代码添加到管理员中,将 admin.site.register(Entry, CategoryAdmin) 中的“条目”更改为“类别”...删除位有效....但是现在当我添加一个不会渲染的新类别!!
    • 管理仪表板还是一般?
    • 当我登录管理并添加一个类别时,它在管理仪表板中可见,但未出现在网页上
    • 非常感谢,我现在明白了,它按预期工作。我的沮丧是必须在每个函数中编写“category_list = Category.objects.all()”,否则 base.html 将不会在每个网页的导航栏中显示类别。这是下一个要解决的问题!
    猜你喜欢
    • 2014-05-05
    • 2017-06-13
    • 1970-01-01
    • 2022-01-24
    • 2022-01-16
    • 1970-01-01
    • 2021-11-22
    • 2016-01-07
    • 2018-08-02
    相关资源
    最近更新 更多