Django-mptt Hatası

Merhaba Arkadaşlar.
Django ile free-template üzerinde web geliştirmeye çalışıyorum.
Django-mptt ile kategorilendirmede bir sıkıntı yaşıyorum. python3 manage.py runserver yapdığımda bir sıkıntı olmuyor. Anasayfaya giriş yapıyorum. Admin panelinde de bir problem yok. Ancak anasayfada diğer sayfalara girmek isteğimde hata alıyorum. Konunun özeti böyle. Aşağıya ilgili sayfaların kodlarını yazacağım. Başka eklemem gereken kod var mı, bilemiyorum. Eksiklerim olursa tabi ki memnuniyetle tamamlarım. Teşekkür ederim.

Not: settings.py 'da ‘mptt’ ekli.

Terminal çıktısı:

$ python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
September 11, 2020 - 15:44:00
Django version 3.0.7, using settings 'eticaret.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Internal Server Error: /hakkimizda/
Traceback (most recent call last):
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 828, in _resolve_lookup
    current = current[bit]
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/context.py", line 83, in __getitem__
    raise KeyError(key)
KeyError: 'category'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 834, in _resolve_lookup
    if isinstance(current, BaseContext) and getattr(type(current), bit):
AttributeError: type object 'RequestContext' has no attribute 'category'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 842, in _resolve_lookup
    current = current[int(bit)]
ValueError: invalid literal for int() with base 10: 'category'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/aakmaz/e-ticaret/home/views.py", line 24, in hakkimizda
    return render(request, 'home/hakkimizda.html', context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 171, in render
    return self._render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/loader_tags.py", line 188, in render
    return template.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 173, in render
    return self._render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 936, in render
    bit = node.render_annotated(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 903, in render_annotated
    return self.render(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/mptt/templatetags/mptt_tags.py", line 266, in render
    queryset = self.queryset_var.resolve(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 795, in resolve
    value = self._resolve_lookup(context)
  File "/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py", line 847, in _resolve_lookup
    raise VariableDoesNotExist("Failed lookup for key "
django.template.base.VariableDoesNotExist: Failed lookup for key [category] in [{'True': True, 'False': False, 'None': None}, {}, {}, {'setting': <Setting: Alış veriş sitesimize hoş geldiniz>}]
[11/Sep/2020 15:56:35] "GET /hakkimizda/ HTTP/1.1" 500 205262

Browser çıktısı (Traceback diye devam ediyor)

VariableDoesNotExist at /hakkimizda/
Failed lookup for key [category] in [{'True': True, 'False': False, 'None': None}, {}, {}, {'setting': <Setting: Alış veriş sitesimize hoş geldiniz>}]
Request Method:	GET
Request URL:	http://localhost:8000/hakkimizda/
Django Version:	3.0.7
Exception Type:	VariableDoesNotExist
Exception Value:	
Failed lookup for key [category] in [{'True': True, 'False': False, 'None': None}, {}, {}, {'setting': <Setting: Alış veriş sitesimize hoş geldiniz>}]
Exception Location:	/home/aakmaz/.local/lib/python3.8/site-packages/django/template/base.py in _resolve_lookup, line 847
Python Executable:	/usr/bin/python3
Python Version:	3.8.2
Python Path:	
['/home/aakmaz/e-ticaret',
 '/usr/lib/python38.zip',
 '/usr/lib/python3.8',
 '/usr/lib/python3.8/lib-dynload',
 '/home/aakmaz/.local/lib/python3.8/site-packages',
 '/usr/local/lib/python3.8/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/usr/lib/python3.8/dist-packages']
Server time:	Fri, 11 Sep 2020 15:56:35 +0000
Error during template rendering
In template /home/aakmaz/e-ticaret/home/templates/home/sidebar.html, error at line 29

Failed lookup for key [%s] in %r
19	
20	          <span class="category-header">Categories <i class="fa fa-list"></i></span>
21	
22	          <!-- load mptt_tags -->
23	
24	
25	          <ul class="category-list">
26	
27	            {% load mptt_tags %}
28	
29	            {% recursetree category %}
30	            <li class="dropdown side-dropdown">
31	              <a href="/category/{{ node.slug }}" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="true">{{ node.title }}
32	                <i class="fa fa-angle-right"></i>
33	              </a>
34	
35	              <div class="custom-menu">
36	                <div class="row">
37	                  <div class="col-md-4">
38	
39	                    {% if not node.is_leaf_node %}

models.py

from ckeditor_uploader.fields import RichTextUploadingField
from django.db import models
from django.utils.safestring import mark_safe
from mptt.fields import TreeForeignKey
from mptt.models import MPTTModel

# Create your models here.
class Category(MPTTModel):
    STATUS = (
        ('True', 'Evet'),
        ('False', 'Hayır'),
    )
    title = models.CharField(max_length=150)
    keywords = models.CharField(blank=True, max_length=255)
    description = models.CharField(blank=True, max_length=255)
    image = models.ImageField(blank=True, upload_to='images/')
    status = models.CharField(max_length=10, choices=STATUS)
    slug = models.SlugField()
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)
    create_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

    class MPTTMeta:
        order_insertion_by = ['title']

    # admin paneli için ekledik
    def __str__(self):               # __str__ method elaborated later in            
	    full_path = [self.title]     # post. use __unicode__ in place of
	    k = self.parent
	    while k is not None:
		    full_path.append(k.title)
		    k = k.parent
	    return ' / '.join(full_path[::-1])  
	
    def image_tag(self):
        return mark_safe('<img src="{}" height="50"/>'.format(self.image.url))
    image_tag.short_description = 'Image'
    
class Product(models.Model):
	STATUS = (
		('True', 'Evet'),
		('False', 'Hayır'),
	)
	category = models.ForeignKey(Category, on_delete=models.CASCADE) # relation with Category table
	title = models.CharField(max_length=150)
	keywords = models.CharField(blank=True, max_length=255)
	description = models.CharField(blank=True, max_length=255)
	image = models.ImageField(blank=True, upload_to='images/')
	price = models.FloatField()
	amount = models.IntegerField()
	detail = RichTextUploadingField()
	status = models.CharField(max_length=10, choices=STATUS)
	slug = models.SlugField(blank=True, max_length=150)
	create_at = models.DateTimeField(auto_now_add=True)
	update_at = models.DateTimeField(auto_now=True)

	def __str__(self):
		return self.title
	
	def image_tag(self):
		return mark_safe('<img src="{}" height="50"/>'.format(self.image.url))
	image_tag.short_description = 'Image'

class Images(models.Model):
	product = models.ForeignKey(Product, on_delete=models.CASCADE)
	title = models.CharField(max_length=50, blank=True)
	image = models.ImageField(blank=True, upload_to='images/')

	def __str__(self):
		return self.title
	
	def image_tag(self):
		return mark_safe('<img src="{}" height="50"/>'.format(self.image.url))
	image_tag.short_description = 'Image'

admin.py

from django.contrib import admin
from mptt.admin import DraggableMPTTAdmin, MPTTModelAdmin

# Register your models here.
from product.models import Category, Images, Product

class ProductImageInline(admin.TabularInline):
    model = Images
    extra = 5

class CategoryAdmin(admin.ModelAdmin):
    list_display = ['title', 'status', 'image_tag']
    list_filter = ['status']
    readonly_fields = ('image_tag',) # buna dikkat et!

class ProductAdmin(admin.ModelAdmin):
    list_display = ['title', 'category', 'price', 'amount', 'image_tag', 'status']
    readonly_fields = ('image_tag',)
    list_filter = ['status', 'category']
    inlines = [ProductImageInline]

class ImagesAdmin(admin.ModelAdmin):
    list_display = ['title', 'product', 'image_tag']
    readonly_fields = ('image_tag',)

class CategoryAdmin2(DraggableMPTTAdmin):
    mptt_indent_field = "title"
    list_display = ('tree_actions', 'indented_title',
                    'related_products_count', 'related_products_cumulative_count')
    list_display_links = ('indented_title',)

    def get_queryset(self, request):
        qs = super().get_queryset(request)

        # Add cumulative product count
        qs = Category.objects.add_related_count(
                qs,
                Product,
                'category',
                'products_cumulative_count',
                cumulative=True)

        # Add non cumulative product count
        qs = Category.objects.add_related_count(qs,
                 Product,
                 'category',
                 'products_count',
                 cumulative=False)
        return qs

    def related_products_count(self, instance):
        return instance.products_count
    related_products_count.short_description = 'Related products (for this specific category)'

    def related_products_cumulative_count(self, instance):
        return instance.products_cumulative_count
    related_products_cumulative_count.short_description = 'Related products (in tree)'

admin.site.register(Category, CategoryAdmin2)
admin.site.register(Product, ProductAdmin)
admin.site.register(Images, ImagesAdmin)

views.py

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse, HttpResponseRedirect
from home.models import ContactForm, ContactFormMessage, Setting
from django.contrib import messages
from product.models import Category, Product

def index(request):
    setting = Setting.objects.get(pk=1)
    sliderdata = Product.objects.all()[:4]
    category = Category.objects.all() # kategory 'leri çağıralım

    context = {'setting':setting,
                'category':category,  # kategory 'leri index saygasına gönderiyoruz
                'page':'home', 
                'sliderdata':sliderdata}
    return render(request, 'home/index.html', context)

def hakkimizda(request):
    setting = Setting.objects.get(pk=1)
    context = {'setting':setting}
    return render(request, 'home/hakkimizda.html', context)

def referanslar(request):
    setting = Setting.objects.get(pk=1)
    context = {'setting':setting}
    return render(request, 'home/referanslarimiz.html', context)

def iletisim(request):

    if request.method == 'POST': # form post edildiyse
        form = ContactForm(request.POST)
        if form.is_valid():
            data = ContactFormMessage() # model ile bağlantı kur
            data.name = form.cleaned_data['name'] # formdan bilgisiyi sil
            data.email = form.cleaned_data['email']
            data.subject = form.cleaned_data['subject']
            data.message = form.cleaned_data['message']
            data.ip = request.META.get('REMOTE_ADDR')
            data.save() # veritabanına kaydet
            messages.success(request, "Mesajınız başarı ile gönderilmiştir. Teşekkür ederiz.")
            return HttpResponseRedirect ('/iletisim')

    setting = Setting.objects.get(pk=1)
    form = ContactForm()
    context = {'setting':setting, 'form':form}
    return render(request, 'home/iletisim.html', context)

urls.py

from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
from home import views

urlpatterns = [
    path('', include('home.urls')),
    path('home/', include('home.urls')),
    path('hakkimizda/', views.hakkimizda, name='hakkimizda'),
    path('referanslar/', views.referanslar, name='referanslar'),
    path('iletisim/', views.iletisim, name='iletisim'),
    path('product/', include('product.urls')),
    path('admin/', admin.site.urls),
    path('ckeditor/', include('ckeditor_uploader.urls')),
    path('product/', views.Category, name='category'),
]

if settings.DEBUG: # new
	urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

sidebar.html (ilgili kısım kodları)

{% load static %}

<!-- NAVIGATION -->
<div id="navigation">
  <!-- container -->
  <div class="container">
    <div id="responsive-nav">
      <!-- category nav -->

      <!-- Buraya alt sayfalar için onclick koyacağız 
				<div class="category-nav show-on-click">
				-->

      {% if page %}
      <div class="category-nav">
        {% else %}
        <div class="category-nav show-on-click">
          {% endif %}

          <span class="category-header">Categories <i class="fa fa-list"></i></span>

          <!-- load mptt_tags -->


          <ul class="category-list">

            {% load mptt_tags %}

            {% recursetree category %}
            <li class="dropdown side-dropdown">
              <a href="/category/{{ node.slug }}" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="true">{{ node.title }}
                <i class="fa fa-angle-right"></i>
              </a>

              <div class="custom-menu">
                <div class="row">
                  <div class="col-md-4">

                    {% if not node.is_leaf_node %}
                    <ul class="list-links">
                      <li><a href="/category/{{ node.slug }}">{{ children }}</a></li>

                    </ul>
                    {% endif %}
                    <hr class="hidden-md hidden-lg" />

                  </div>
                </div>
              </div>
            </li>
            {% endrecursetree %}
1 Beğeni