在django中调用Python对象时超出了最大递归深度
我想在我的web应用程序中创建注释。每个评论只能连接到一篇文章。我可以通过“管理”字段添加评论,但当我在网页上尝试时,会出现错误。你能帮帮我吗。 多谢各位 models.py在django中调用Python对象时超出了最大递归深度,python,django,django-views,Python,Django,Django Views,我想在我的web应用程序中创建注释。每个评论只能连接到一篇文章。我可以通过“管理”字段添加评论,但当我在网页上尝试时,会出现错误。你能帮帮我吗。 多谢各位 models.py from django.db import models from django.contrib.auth.models import User from django.utils.text import slugify # Create your models here. class PostModel(models.
from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify
# Create your models here.
class PostModel(models.Model):
post = models.TextField(max_length=256, unique=True)
slug = models.SlugField(max_length=20, unique=True)
author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='post_author')
created_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_on']
def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.post)
super().save(*args, **kwargs)
def __repr__(self):
return f"{self.post}"
class CommentModel(models.Model):
post = models.ForeignKey('dictionary.PostModel', on_delete=models.CASCADE, related_name='post_comment')
comment=models.TextField(max_length=256,unique=True)
author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='comment_author')
created_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_on']
def get_absolute_url(self):
return reverse("comment_detail",kwargs={'pk':self.pk})
def __str__(self):
return self.comment
views.py
from django.shortcuts import render,redirect
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import generic
from django.views.generic.edit import FormMixin
from .models import PostModel,CommentModel
from .forms import PostForm,CommentForm
from django.urls import reverse
from django.views.generic.edit import ModelFormMixin
# Create your views here.
class PostList(LoginRequiredMixin,generic.CreateView):
template_name = 'home.html'
form=PostForm
model = PostModel
fields=['post']
success_url="/home"
def form_valid(self, form):
form.instance.author=self.request.user
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context ['postmodel_list'] = PostModel.objects.order_by('-created_on')
return context
class PostDetail(LoginRequiredMixin,ModelFormMixin,generic.DetailView):
model = PostModel
template_name = 'post_detail.html'
form_class=CommentForm
def get_success_url(self):
return reverse('post_detail',kwargs={'slug':self.object.slug})
def get_context_data(self, **kwargs):
context = super(PostDetail,self).get_context_data(**kwargs)
context ['commentmodel_list'] = CommentModel.objects.filter(post=self.object).order_by('-created_on')
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.post = self.object
return super(PostDetail,self).form_valid(form)
回溯
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/home/bu-da-benim-ilk-postum/
Django Version: 3.0.8
Python Version: 3.8.1
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'crispy_forms',
'account',
'dictionary']
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']
Traceback (most recent call last):
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\contrib\auth\mixins.py", line 52, in dispatch
return super().dispatch(request, *args, **kwargs)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\ekrem\Documents\Django\project\beehive\dictionary\views.py", line 51, in post
return self.form_valid(form)
File "C:\Users\ekrem\Documents\Django\project\beehive\dictionary\views.py", line 59, in form_valid
return super(PostDetail,self).form_valid(form)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\edit.py", line 125, in form_valid
self.object = form.save()
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\models.py", line 459, in save
self.instance.save()
File "C:\Users\ekrem\Documents\Django\project\beehive\dictionary\models.py", line 17, in save
super().save(*args, **kwargs)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\base.py", line 745, in save
self.save_base(using=using, force_insert=force_insert,
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\base.py", line 782, in save_base
updated = self._save_table(
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\base.py", line 864, in _save_table
updated = self._do_update(base_qs, using, pk_val, values, update_fields,
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\base.py", line 917, in _do_update
return filtered._update(values) > 0
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py", line 771, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\compiler.py", line 1500, in execute_sql
cursor = super().execute_sql(result_type)
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\compiler.py", line 1139, in execute_sql
sql, params = self.as_sql()
File "C:\Users\ekrem\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\compiler.py", line 1460, in as_sql
raise TypeError(
Exception Type: TypeError at /home/bu-da-benim-ilk-postum/
Exception Value: Tried to update field dictionary.PostModel.post with a model instance, PostModel object (4). Use a value compatible with TextField.
我还有一个str方法,其中我返回了self.comment或str(self.comment),或者有一个repr函数,但每次都会出现奇怪的错误。方法的实现不正确。我认为你应该使用
\uuuu repr\uuu
方法。但是如果您确定要使用\uuu str\uuu
方法,请不要在内部使用str
函数
我建议这样做:
def\uuu repr\uu(自):
返回f“{self.post}”
请编辑您的问题,并添加评论表单
和后期模型
代码。很抱歉打扰您。但是,您也可以添加错误stacktrace吗?没问题,现在您看到了这个错误:尝试使用模型实例更新field dictionary.PostModel.post。使用与TextField兼容的值。已更新答案。请再试一次,真奇怪!你能把新的stacktrace发给我吗?可以肯定的是,您的代码现在是否只有\uuuu repr\uuuu
方法而没有\uuu str\uuu
方法?您是否将CommentModel的方法更改为使用self.comment
?我在问题中使用了我的新代码,我只使用了repr,而我不理解第二个问题哦!您有两个\uuuu str\uuu
方法。一个在PostModel
中,另一个在CommentModel
中。它们应该分别返回f{self.post}
和f{self.comment}
。并且postdail
的form\u valid
方法的第二行导致了新的错误。self.instance.post
应该分配一个文本,而不是一个对象。