ContentType 匹配查询在 django 2.2 上不存在
ContentType matching query does not exist on django 2.2
我一直在使用 django 构建博客,当我尝试在每个 post 下创建评论部分时,我得到了评论图标(我可以在其中输入一些评论)但是当我 post 评论我立即得到错误,即 "ContentType matching query does not exist"。
我试图在stack和youtube上找到问题,但他们说解决这个问题需要在dumpdata上有经验
class Comment(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, null=True, on_delete=models.SET_NULL)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
content = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
objects = CommentManager()
def blog_post_detail_view(request, slug):
instance = get_object_or_404(BlogPost, slug=slug)
share_string = quote_plus(instance.content)
initial_data = {
'content_type': instance.get_content_type,
'object_id': instance.id
}
form = CommentForm(request.POST or None, initial=initial_data)
if form.is_valid():
c_type = form.cleaned_data.get('content_type')
content_type = ContentType.objects.get(model=c_type)
obj_id = form.cleaned_data.get('object_id')
content_data = form.cleaned_data.get('content')
new_comment, created = Comment.objects.get_or_create(
user=request.user,
content_type=content_type,
object_id=obj_id,
content=content_data
)
comments = instance.comments
template_name = 'blog/detail.html'
context = {
"object": instance,
'comments': comments,
'share_string': share_string,
'comment_form': form
}
return render(request, template_name, context)
from django import forms
from .models import Comment
class CommentForm(forms.Form):
content_type = forms.CharField(widget=forms.HiddenInput)
object_id = forms.IntegerField(widget=forms.HiddenInput)
content = forms.CharField(widget=forms.Textarea)
所以基本上我应该得到我的评论 posted 但是我得到了那个错误:"ContentType matching query does not exist".
你的CommentForm
应该是ModelForm
,你可以在ModelFormMeta.widgets
的
中设置widgets
class CommentForm(forms.ModelForm):
class Meta:
model = Meta
fields = ('content_type', 'object_id', 'content')
widgets = {
'content_type': forms.HiddenInput,
'object_id': forms.HiddenInput,
}
这样 form.cleaned_data.get('content_type')
将包含实际的 ContentType 对象,因此您不必 ContentType.objects.get
我一直在使用 django 构建博客,当我尝试在每个 post 下创建评论部分时,我得到了评论图标(我可以在其中输入一些评论)但是当我 post 评论我立即得到错误,即 "ContentType matching query does not exist"。
我试图在stack和youtube上找到问题,但他们说解决这个问题需要在dumpdata上有经验
class Comment(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, null=True, on_delete=models.SET_NULL)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
content = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
objects = CommentManager()
def blog_post_detail_view(request, slug):
instance = get_object_or_404(BlogPost, slug=slug)
share_string = quote_plus(instance.content)
initial_data = {
'content_type': instance.get_content_type,
'object_id': instance.id
}
form = CommentForm(request.POST or None, initial=initial_data)
if form.is_valid():
c_type = form.cleaned_data.get('content_type')
content_type = ContentType.objects.get(model=c_type)
obj_id = form.cleaned_data.get('object_id')
content_data = form.cleaned_data.get('content')
new_comment, created = Comment.objects.get_or_create(
user=request.user,
content_type=content_type,
object_id=obj_id,
content=content_data
)
comments = instance.comments
template_name = 'blog/detail.html'
context = {
"object": instance,
'comments': comments,
'share_string': share_string,
'comment_form': form
}
return render(request, template_name, context)
from django import forms
from .models import Comment
class CommentForm(forms.Form):
content_type = forms.CharField(widget=forms.HiddenInput)
object_id = forms.IntegerField(widget=forms.HiddenInput)
content = forms.CharField(widget=forms.Textarea)
所以基本上我应该得到我的评论 posted 但是我得到了那个错误:"ContentType matching query does not exist".
你的CommentForm
应该是ModelForm
,你可以在ModelFormMeta.widgets
的
class CommentForm(forms.ModelForm):
class Meta:
model = Meta
fields = ('content_type', 'object_id', 'content')
widgets = {
'content_type': forms.HiddenInput,
'object_id': forms.HiddenInput,
}
这样 form.cleaned_data.get('content_type')
将包含实际的 ContentType 对象,因此您不必 ContentType.objects.get