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 %}