简体   繁体   English

Django 'str' 对象不可调用。 如何处理?

[英]Django 'str' object is not callable. How to deal with it?

I have problem with one part of my app.我的应用程序的一部分有问题。 Everything works well, but when I click on a link named 'koszyk' I get:一切正常,但是当我点击一个名为“koszyk”的链接时,我得到:

TypeError at /sklep/koszyk/

'str' object is not callable

Request Method:     GET
Request URL:    http://localhost:8000/sklep/koszyk/
Exception Type:     TypeError
Exception Value:   'str' object is not callable

Exception Location:     /usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response, line 99
Python Executable:  /usr/bin/python
Python Version:     2.7.6
Python Path:    ['/home/mdawidowski/szkola/django/sklepik', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time:    Pi, 5 Czerw 2015 18:49:26 +0200

I've tried everything and I can't find anything... All I know is that problem is with model 'koszyk', because everything else works well.我已经尝试了一切,但找不到任何东西......我只知道问题出在模型“koszyk”上,因为其他一切都运行良好。 I hope you can help me.我希望你能帮助我。

My files: Views.py我的文件:Views.py

# coding: utf-8
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views.generic.simple import direct_to_template
from django.core.mail import send_mail
from django.template import Context, loader
from django.conf import settings
from sklep.models import Produkt
from sklep.forms import ZamowienieForm

def koszyk(request):
    koszyk = request.session.get('koszyk', [])
    produkty = list(Produkt.objects.filter(pk__in=koszyk))

    if request.method == 'POST':
        formularz = ZamowienieForm(request.POST)

        if formularz.is_valid():
            dane = formularz.cleaned_data
            tresc = loader.get_template('sklep/zamowienie.txt').render(Context({'produkty': produkty, 'dane': dane}))

            send_mail('Potwierdzenie zakupu', tresc, settings.EMAIL_SKLEPU, [dane['email']])
            send_mail(u'Zamówienie', tresc, dane['email'], [settings.EMAIL_SKLEPU])

            del request.session['koszyk']

            return HttpResponseRedirect(reverse('sklep_koszyk'))
    else:
        formularz = ZamowienieForm()

    if koszyk:
        kontekst = {'koszyk': produkty, 'formularz': formularz}
    else:
        kontekst = {'koszyk': []}

    return direct_to_template(request, 'sklep/koszyk.html', extra_context = kontekst)

def koszyk_dodaj(request, id_produktu):
    koszyk = request.session.get('koszyk', [])
    if int(id_produktu) not in koszyk:
        koszyk.append(int(id_produktu))
    request.session['koszyk'] = koszyk
    return HttpResponseRedirect(reverse('sklep_koszyk'))

Urls.py网址.py

from django.conf.urls.defaults import * from sklep.models import Produkt

urlpatterns = patterns('',
    url(r'^produkty/$', 'django.views.generic.list_detail.object_list', {'queryset': Produkt.objects.all().select_related('kategorie'), 'paginate_by': 1}, "sklep_produkty"),  
    url(r'^koszyk/$', 'koszyk', name="sklep_koszyk"), 
    url(r'^koszyk/dodaj/(\d+)/$', 'koszyk_dodaj', name="sklep_koszyk_dodaj"),
 )

It would be great if someone can help me.如果有人可以帮助我,那就太好了。

You are using variable name koszyk multiple times with different values assigned to it.您多次使用变量名称koszyk ,并koszyk分配了不同的值。

eg your view name is koszyk and in same view you are using same variable name to store result of request.session.get('koszyk', [])例如,您的视图名称是koszyk并且在同一视图中您使用相同的变量名称来存储request.session.get('koszyk', [])

So cleanup your code for such issues.因此,请针对此类问题清理您的代码。

Also, in your urls.py give complete path for the view instead of just function name, eg specify '<app_name>.views.koszyk'此外,在您的urls.py提供视图的完整路径,而不仅仅是函数名称,例如指定'<app_name>.views.koszyk'

It's possible you're overriding name spaces of the function itself:您可能会覆盖函数本身的名称空间:

def koszyk(request):
    koszyk = request.session.get('koszyk', [])

That second line should effectively redefine koszyk from the function you've declared, to whatever string is lying around in the session.第二行应该有效地将 koszyk 从您声明的函数重新定义为会话中存在的任何字符串。 Then, when your program later tries to serve koszyk as a view, it suddenly has a string instead of the function you've declared然后,当您的程序稍后尝试将 koszyk 作为视图提供服务时,它突然有一个字符串而不是您声明的函数

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM