【发布时间】:2018-07-15 23:36:32
【问题描述】:
Django 版本:1.11 Python 版本:3.5 我正在尝试遵循 Django 教程,但遇到一个无法解决的问题,我无法删除此错误
异常类型:/posts/new/ 处的 TypeError
异常值:__str__ 返回非字符串(NoneType 类型)
追溯
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/posts/new/
Django Version: 1.11
Python Version: 3.6.6
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'bootstrap3',
'accounts',
'groups',
'posts']
Installed Middleware:
['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']
Template error:
In template E:\Private\django_project\social_clone\simplesocial\templates \base.html, error at line 10
__str__ returned non-string (type NoneType) 1 : <!DOCTYPE html>
2 : {% load staticfiles %}
3 : <html>
4 : <head>
5 : <meta charset="utf-8">
6 : <title>Egy Social</title>
7 : <!-- Latest compiled and minified CSS -->
8 :
9 :
10 : <link rel="stylesheet" href="https: //maxcdn.bootstrapcdn.com /bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
11 :
12 :
13 : <!-- Optional theme -->
14 :
15 : <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
16 : <!-- Latest compiled and minified JavaScript -->
17 : <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
18 : <link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">
19 : <link rel="stylesheet" href="{% static 'simplesocial/css/master.css'%}">
20 : </head>
Traceback:
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\core\handlers\exception.py" in inner
41.response = get_response(request)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
217.response = self.process_exception_by_middleware(e, request)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
215. response = response.render()
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\response.py" in render
107.
self.content = self.rendered_content
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\response.py" in rendered_content
84.
content = template.render(context, self._request)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\backends\django.py" in render
66.
return self.template.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render
207.
return self._render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in _render
199.
return self.nodelist.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render
990.
bit = node.render_annotated(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render_annotated
957.
return self.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\loader_tags.py" in render
177.
return compiled_parent._render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in _render
199.
return self.nodelist.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render
990.
bit = node.render_annotated(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render_annotated
957.
return self.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\loader_tags.py" in render
177.
return compiled_parent._render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in _render
199.
return self.nodelist.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render
990.
bit = node.render_annotated(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render_annotated
957.
return self.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\loader_tags.py" in render
72.
result = block.nodelist.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render
990.
bit = node.render_annotated(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render_annotated
957.
return self.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\loader_tags.py" in render
72.
result = block.nodelist.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render
990.
bit = node.render_annotated(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\base.py" in render_annotated
957.
return self.render(context)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\template\library.py" in render
203.
output = self.func(*resolved_args, **resolved_kwargs)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\templatetags\bootstrap3.py" in bootstrap_form
338.
return render_form(*args, **kwargs)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\forms.py" in render_form
53.
return renderer_cls(form, **kwargs).render()
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\renderers.py" in render
87.
return mark_safe(self._render())
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\renderers.py" in _render
230.
return self.render_errors(self.error_types) + self.render_fields()
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\renderers.py" in render_fields
194.
bound_css_class=self.bound_css_class,
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\forms.py" in render_field
69.
return renderer_cls(field, **kwargs).render()
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\renderers.py" in render
87. return mark_safe(self._render())
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\bootstrap3\renderers.py" in _render
551. html = self.field.as_widget(attrs=self.widget.attrs)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\boundfield.py" in as_widget
120. **kwargs
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\widgets.py" in render
220. context = self.get_context(name, value, attrs)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\widgets.py" in get_context
665. context = super(Select, self).get_context(name, value, attrs)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\widgets.py" in get_context
627. context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\widgets.py" in optgroups
574. for option_value, option_label in chain(self.choices):
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\models.py" in __iter__
1118. yield self.choice(obj)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\models.py" in choice
1124. return (self.field.prepare_value(obj), self.field.label_from_instance(obj))
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\forms\models.py" in label_from_instance
1189. return force_text(obj)
File "C:\Users\Ahmed-Fathi\Anaconda2\envs\myDjangoEnv\lib\site-packages\django\utils\encoding.py" in force_text
76. s = six.text_type(s)
Exception Type: TypeError at /posts/new/
Exception Value: __str__ returned non-string (type NoneType)
这是我的 models.py 文件
enter code here
from django.conf import settings
from django.core.urlresolvers import reverse
from django.db import models
import misaka
from groups.models import Group
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
user = models.ForeignKey(User, related_name="posts")
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
message_html = models.TextField(editable=False)
group = models.ForeignKey(Group,
related_name="posts",null=True,blank=True)
def __str__(self):
return self.message
def save(self, *args, **kwargs):
self.message_html = misaka.html(self.message)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"posts:single",
kwargs={
"username": self.user.username,
"pk": self.pk
}
)
class Meta:
ordering = ["-created_at"]
unique_together = ["user", "message"]
这就是我的 urls.py 帖子应用程序
from django.conf.urls import url
from . import views
app_name='posts'
urlpatterns = [
url(r"^$", views.PostList.as_view(), name="all"),
url(r"new/$", views.CreatePost.as_view(), name="create"),
url(r"by/(?P<username>[-\w]+)/$"
,views.UserPosts.as_view(),name="for_user"),
url(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$"
,views.PostDetail.as_view(),name="single"),
url(r"delete/(?P<pk>\d+)/$",views.DeletePost.as_view(),name="delete"),
]
settings.py
enter code here
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR,'templates')
SECRET_KEY = '(5qpl&b-b48^jszl@nz02#lgbw%tp(o)_wb!)b&k(j9*kueh@&'
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'bootstrap3',
'accounts',
'groups',
'posts',
]
MIDDLEWARE = [
'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',
]
ROOT_URLCONF = 'simplesocial.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATE_DIR,],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'simplesocial.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME':
'django.contrib.auth.password_validation.
UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.
MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.
CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.
NumericPasswordValidator',
},
]
enter code here
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
LOGIN_REDIRECT_URL = "test"
LOGOUT_REDIRECT_URL = "thanks"
我用谷歌搜索但什么也没找到
【问题讨论】:
-
为什么你认为错误信息在说谎?
-
所以
self.message是None,当您的数据库行中该列的值为空时,就会发生这种情况。使用return self.message or ''。 -
上面写着
__str__ returned NoneType,试试return self.message or '' -
@thatBird 我试过这个并得到同样的错误
-
你试过了吗,def __str__(self): return str(self.message)
标签: python django django-templates