[英]How to get POST and create message on Django using DetailView
我有 Post model 和 Message model。
我想获取 POST,在一个帖子上创建消息并进行预览。
我有ValueError
Cannot assign "<bound method PostDetailView.post of <blog.views.PostDetailView object at 0x7fa9a370b8>>": "Message.post" must be a "Post" instance.
在body = request.POST.get('body')
我怎样才能做到这一点?
模型.py
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User,on_delete=models.CASCADE)
topic = models.ForeignKey(Topic,on_delete=models.SET_NULL,null=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail',kwargs={'pk':self.pk})
class Message(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
post = models.ForeignKey(Post,on_delete=models.CASCADE)
body = models.TextField()
date_posted = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.body[0:50]
视图.py
class PostDetailView(DetailView):
model = Post
def post(self, request, *args, **kwargs):
message = Message(
user = request.user,
post = self.post,
body = request.POST.get('body')
)
message.save()
return super(PostDetailView,self).post(request, *args, **kwargs)
网址.py
urlpatterns = [
path('post/<int:pk>',PostDetailView.as_view(),name='post-detail')
]
假设您的 url 具有post_id
参数,如https://example.com/?post_id=1
:
def get_post(post_id):
try:
post = Post.objects.get(id=post_id)
except Post.DoesNotExist:
raise ValidationError(f"Post model with id {post_id} was not found.")
def post(self, request, *args, **kwargs):
message = Message(
user = request.user,
post = self.get_post(kwargs.get('pk')),
body = request.POST.get('body')
)
message.save()
return super(PostDetailView,self).post(request, *args, **kwargs)
这应该让你去。 不过,我强烈建议设置一个序列化程序来验证您的查询参数。
class ParamValidationSerializer(serializers.Serializer):
post_id = serializers.IntegerField()
然后将您的帖子 function 更改为:
def post(self, request, *args, **kwargs):
serializer = ParamValidationSerializer(data={'post_id': kwargs.get('pk')})
serializer.is_valid(raise_exception=True)
message = Message(
user = request.user,
post = self.get_post(serializer.data.get('post_id')),
body = request.POST.get('body')
)
message.save()
return super(PostDetailView,self).post(request, *args, **kwargs)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.