【问题标题】:How can I solve "TypeError at /post/new/" in django如何在 django 中解决“TypeError at /post/new/”
【发布时间】:2019-10-31 00:06:31
【问题描述】:

尝试在 Django 版本 2.2 中创建新表单时。我遇到了这个错误

/post/new/join() 参数处的 TypeError 必须是 str 或 bytes,而不是 'tuple'。

我确实尝试过解决问题,但我无法解决。

这些是已采取的步骤..

  1. 我在应用级别(博客文件夹)为 post_new 添加了一个新的 URLConf

    # blog/urls.py
    from django.urls import path
    from . import views
    urlpatterns = [
        path('post/new/', views.BlogCreateView.as_view(), name='post_new'),
    ]
    
  2. 然后,通过导入一个名为 CreateView 的通用类来创建视图,然后 将其子类化以创建一个名为 BlogCreateView 的新视图。

    # blog/views.py
    from django.views.generic import ListView, DetailView
    from django.views.generic.edit import CreateView
    from . models import Post
    
    class BlogCreateView(CreateView):
        model = Post
        template_name = 'post_new.html'
        fields = '__all__'
    

最后一步是创建模板,我们将其命名为 post_new.html。

<!-- templates/post_new.html -->
{% extends 'base.html' %}
{% block content %}
    <h1>New post</h1>
    <form action="" method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Save" />
    </form>
{% endblock %}

已编辑以添加完整的回溯

环境:

请求方法:GET 请求地址:http://127.0.0.1:8000/post/new/

Django 版本:2.2 Python 版本:3.7.3 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', '博客'] 已安装的中间件: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware']

追溯:

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\ntpath.py" 加入 89. for p in map(os.fspath, paths):

在处理上述异常期间(预期的 str、bytes 或 os.PathLike 对象,而不是元组),发生另一个异常:

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" 在内部 34. response = get_response(request)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" 在 _get_response 145. response = self.process_exception_by_middleware(e, request)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" 在 _get_response 143. response = response.render()

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\response.py" 在渲染中 106. self.content = self.rendered_content

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\response.py" 在渲染内容中 81. 模板 = self.resolve_template(self.template_name)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\response.py" 在 resolve_template 63. return select_template(template, using=self.using)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\loader.py" 在选择模板中 42. return engine.get_template(template_name)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\backends\django.py" 在 get_template 34. return Template(self.engine.get_template(template_name), self)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\engine.py" 在 get_template 143. 模板,起源 = self.find_template(template_name)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\engine.py" 在 find_template 125. 模板 = loader.get_template(name, skip=skip)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\loaders\base.py" 在 get_template 18. 来源自self.get_template_sources(template_name):

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\template\loaders\filesystem.py" 在 get_template_sources 36. name = safe_join(template_dir, template_name)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\utils_os.py" 在安全加入 32. final_path = abspath(join(base, *paths))

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\ntpath.py" 加入 115. genericpath._check_arg_types('join', path, *paths)

文件“C:\用户\用户 pc\AppData\Local\Programs\Python\Python37-32\lib\genericpath.py" 在 _check_arg_types 149. (funcname, s.class.name)) 从无

异常类型:/post/new/ 处的 TypeError 异常值:join() 参数必须是 str 或 bytes,而不是 'tuple'

我正在使用 python3.7 和 django2.2

【问题讨论】:

  • 你能分享一下完整的回溯吗?
  • 我会@WillemVanOnsem
  • 你有没有写template_name = 'post_new.html',(所以最后用逗号)?
  • @WillemVanOnsem 我不这么认为,但让我检查一下
  • @WillemVanOnsem 是的,我做到了。谢谢,我已将其删除,现在可以使用了

标签: python django python-3.x django-forms


【解决方案1】:

根据错误,您写了如下内容:

# blog/views.py
from django.views.generic import ListView, DetailView
from django.views.generic.edit import CreateView
from . models import Post

class BlogCreateView(CreateView):
    model = Post
    template_name = 'post_new.html',  # a trailing comma
    fields = '__all__'

因此,template_name 不是字符串,而是包含字符串的单例元组。您应该删除尾逗号。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多