Как я могу решить "TypeError в / post / new /" в Django - PullRequest
2 голосов
/ 17 июня 2019

При попытке создать новую форму в Django vesrsion 2.2.Я столкнулся с этой ошибкой

TypeError в / post / new / join () аргумент должен быть str или байтами, а не 'tuple'.

Я действительно пытался решитьпроблема, но я не могу ее решить.

Это шаги, предпринятые ..

  1. Я добавляю новый URLConf для post_new на уровне приложения (папка блога))

    # 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 URL запроса: 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', 'blog'] Установленный Middleware: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewtjj'. djauth.middleware.AuthenticationMiddleware ',' django.contrib.messages.middleware.MessageMiddleware ',' django.middleware.clickjacking.XFrameOptionsMiddleware ']

Трассировка:

Файл \ Пользователи "C:пользователь pc \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ ntpath.py "в соединении 89. для p в карте (os.fspath, paths):

Во время обработки вышеуказанного исключения (ожидаемый объект str, bytes или os.PathLike, не кортеж), возникло другое исключение:

Файл "C: \ Users \ пользовательский компьютер \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-пакеты \ django \ core \ handlers \ exception.py "во внутреннем 34. response = get_response (запрос)

Файл" C: \ Users \ пользовательский компьютер \ AppData \ Local \ Programs \ Python \ Python37-32 \ "lib \ site-packages \ django \ core \ handlers \ base.py "в _get_response 145. соответственноonse = self.process_exception_by_middleware (e, запрос)

Файл "C: \ Users \ пользовательский компьютер \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \"base.py "в _get_response 143. response = response.render ()

Файл" C: \ Users \ пользовательский ПК \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django\ template \ response.py "в рендере 106. self.content = self.rendered_content

Файл" C: \ Users \ пользовательский ПК \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ template \ response.py "в rendered_content 81. template = self.resolve_template (self.template_name)

Файл" C: \ Users \ пользователь pc \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ template \ response.py "в resol_template 63. вернуть select_template (template, using = self.using)

Файл" C: \ Users \ user pc \ AppData \ Local\ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ template \ loader.py "в select_template 42. вернуть engine.get_template (template_name)

Файл "C: \ Users \ user pc \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ template \ backends \ django.py" в get_template 34. вернуть шаблон (self.engine.get_template (template_name), self)

Файл "C: \ Users \ user pc \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ template \ engine.py"в get_template 143. template, origin = self.find_template (template_name)

Файл" C: \ Users \ пользовательский ПК \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django\ template \ engine.py "в find_template125. template = loader.get_template (name, skip = skip)

Файл "C: \ Users \ user 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: \ Users \ user 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: \ Users \ пользовательский ПК \ AppData \ Local \ Programs \ "Python \ Python37-32 \ lib \ site-packages \ django \ utils_os.py "в safe_join 32. final_path = abspath (join (base, * paths))

Файл" C: \ Users \ user pc \ "AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ ntpath.py "в соединении 115. genericpath._check_arg_types ('объединение', путь, * пути)

Файл" C: \ Users \ пользовательский компьютер "\ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ genericpath.py "в _check_arg_types 149. (funcname, s. class . name )) из None

Исключение Тыpe: TypeError at / post / new / Exception Значение: аргумент join () должен быть str или байтами, а не 'tuple'

Я использую python3.7 с django2.2

1 Ответ

3 голосов
/ 17 июня 2019

Исходя из ошибки, вы написали что-то вроде:

# 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'<b>,</b>  # a trailing comma
    fields = '__all__'

В результате template_name это не строка, а одиночный кортеж, содержащий строку.Вы должны удалить запятую.

...