提出TypeError(在include()的情况下,'view必须是可调用的或list / tuple

时间:2017-03-10 07:55:16

标签: python django

我对python和django很新。我知道这个错误表明了什么。这是说我需要将视图导入到网址中。奇怪的是在我的笔记本电脑上运行正常并加载页面,但在我的桌面上它不是。我正在使用git repo,只是从我的笔记本电脑中取出了工作变化。我在两台机器上使用相同的Python解释器(3.5.3)。我得到与标题所述的所有URL相同的错误消息。

这是Full Stack

Unhandled exception in thread started by <function check_errors.

<locals>.wrapper at 0x000001FA9FAB7400>
Traceback (most recent call last):
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\core\management\commands\runserver.py", line 121, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\core\management\base.py", line 374, in check
    include_deployment_checks=include_deployment_checks,
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\core\management\base.py", line 361, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\core\checks\registry.py", line 81, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\core\checks\urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\core\checks\urls.py", line 24, in check_resolver
    for pattern in resolver.url_patterns:
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\utils\functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\urls\resolvers.py", line 313, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\utils\functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\urls\resolvers.py", line 306, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 673, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "C:\Users\Rpg Legend\PycharmProjects\matchmaker\src\matchmaker\urls.py", line 9, in <module>
    url(r'^$', 'newsletter.views.home', name='home'),
  File "C:\Users\Rpg Legend\mm\lib\site-packages\django\conf\urls\__init__.py", line 85, in url
    raise TypeError('view must be a callable or a list/tuple in the case of include().')
TypeError: view must be a callable or a list/tuple in the case of include().

媒(项目/主)/urls.py:

from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib import admin

urlpatterns = [
    url(r'^$', 'newsletter.views.home', name='home'),
    url(r'^contact/$', 'newsletter.views.contact', name='contact'),
    url(r'^question/$', 'questions.views.home', name='question_home'),
    url(r'^about/$', 'matchmaker.views.about', name='about'),
]

通讯/ views.py

from django.conf import settings
from django.core.mail import send_mail
from django.shortcuts import render
from questions.models import Question

from .forms import ContactForm, SignUpForm


# Create your views here.
def home(request):
    title = 'Sign Up Now'
    form = SignUpForm(request.POST or None)
    context = {
        "title": title,
        "form": form
    }


def contact(request):
    title = 'Contact Us'
    title_align_center = True
    form = ContactForm(request.POST or None)

    if form.is_valid():
        form_email = form.cleaned_data.get("email")
        form_message = form.cleaned_data.get("message")
        form_full_name = form.cleaned_data.get("full_name")
        subject = 'Site contact form'
        from_email = settings.EMAIL_HOST_USER
        to_email = [from_email, 'youotheremail@email.com']
        contact_message = "%s: %s via %s" % (
           form_full_name,
            form_message,
            form_email)
        some_html_message = """
            <h1>hello</h1>
        """

        send_mail(subject,
              contact_message,
              from_email,
              to_email,
              html_message=some_html_message,
              fail_silently=True)

    context = {
        "form": form,
        "title": title,
        "title_align_center": title_align_center,
    }
    return render(request, "forms.html", context)

媒/ views.py

from django.shortcuts import render

def about(request):
    return render(request, "about.html", {})

我希望得到一些帮助或指导。每当我做这样的事情时:

from app_name import views 
from newsletter.views import home, contact

Pycharm将其删除,并说它是一个未使用的import语句。在我参与的其他几个项目中,我不需要将任何视图导入到main / project urls.py中。

2 个答案:

答案 0 :(得分:1)

您已根据需要将视图导入到您的网址,但您错过了下一步使用网址模式中的视图而不是虚线字符串路径

from newsletter.views import home, contact

urlpatterns = [
    url(r'^$', home, name='home'),
    url(r'^contact/$', contact, name='contact'),
    ...
]

在网址模式中使用视图后,PyCharm不应再将其标记为未使用的导入。

在Django 1.10中删除了对虚线字符串路径的支持。如果你的代码在一台机器上运行而在另一台机器上运行,那么听起来你正在运行两个不同版本的Django。尝试在所有计算机上安装相同的软件包版本以避免此类问题非常重要。如果您还没有(try this article),请了解pip freeze和要求文件。

答案 1 :(得分:0)

您的home方法尚未return呈现的模板,这是预期的。

return render(request, "home.html", context)

渲染home视图不适用于笔记本电脑或其他任何地方的当前情况。据我所知,旧版本也都会失败。

自1.10以来,Django也不支持导入路径,但你应该这样做 导入视图,并将其传递到您的网址。

from newsletter import views as newsletter_views
from questions import views as question_views
from matchmaker import views as matchmaker_views

urlpatterns = [
    url(r'^$', newsletter_views.home, name='home'),
    url(r'^contact/$', newsletter_views.contact, name='contact'),
    url(r'^question/$', question_views.home, name='question_home'),
    url(r'^about/$', matchmaker_views.about, name='about'),
]

您应该最好将不同的应用分成每个应用的差异urls.py文件,以防止命名空间冲突。