カテゴリのリストがあり、各カテゴリに投稿のリストがある簡単なアプリを作成しようとしました。
Django AdminでCategoryオブジェクトを削除すると、Adminには表示されなくなりますが、テンプレートには表示されたままになります。これは2つのカテゴリのみを表示している管理者です
Navbarを提供する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でこれらの関数を作成するためのYouTubeビデオをフォローしました...エラーが原因であると恐ろしい感じがします関数の外でcategory_listを定義することへ...あるいはもっと悪いことに!
また、メニューオプションを動的に更新するには、base.htmlに関数を記述する必要がありますか?
これは問題ではありません。すべてを自動的にリロードするためにカスタム関数を追加する必要はありません。Djangoの一括削除メソッドが実際にdelete()
メソッドを呼び出さないのは事実です。
これは、管理サイトから削除する場合にのみ適しています。これがカスタムテンプレートで発生した場合は、別のことが起こっています。しかし、ここでは大丈夫です。
「選択したオブジェクトの削除」アクションは、効率上の理由から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)
更新
コードをもう一度確認したところ、別の脆弱性が見つかりました。
category_list = Category.objects.all()
def home(request):
return render(request,'home.html',{'category_list':category_list})
category_listをローカル変数として使用する必要があります。つまり、home関数内で使用する必要があります。グローバルに(外部で)宣言した場合、実行ごとに1回だけ更新されるため、変更に応答しません。明確にするために、それは
def home(request):
category_list = Category.objects.all()
return render(request,'home.html',{'category_list':category_list})
これが機能する場合は、管理ダッシュボードに加えられた変更を自由に削除してください。場合によっては、削除が実際の問題のようです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加