Py学习  »  Django

(django)如何获取有效形式的对象id?

user22630 • 5 年前 • 1570 次点击  

我正试图用django在一个发布应用上做一个评论表单,问题是我似乎无法获得它自己对象的id,知道吗?

#views.py
class MyFormView(FormView):
    form_class = CommentForm
    success_url = "/"

    def form_valid(self,form,*args,**kwargs):
        comment = form.save(commit=False)
        comment.message=Message.objects.get(id=???)
        comment.save()
        return super(MyFormView, self).form_valid(form)
#urls.py
urlpatterns = [
    path('', MessageListView.as_view(),name="messaging-main"),
    path('new', MessageCreateView.as_view(),name="messaging-new"),
    path('post/<int:pk>', MessageDetailView.as_view(),name="messaging-detail"),
    path('my_form',MyFormView.as_view(),name="form-view")
]
#forms.py
class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['comment']
#models.py
class Message(models.Model):
    date_posted = models.DateTimeField(default=timezone.now)
    message = models.TextField()
    image = models.ImageField(default="")


    def __str__(self):
        return self.message

class Comment(models.Model):
    message = models.ForeignKey(Message,on_delete=models.CASCADE)
    comment = models.TextField(max_length=50)
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return "Comment on {}".format(str(self.date_posted))

    def get_absolute_url(self):
        return reverse("messaging-detail",kwargs={"id":self.id})

如果我要替换???对于示例7,它将在id为7的消息(或post)上发布每个评论,但我希望将评论发布到我看到的消息上感谢任何帮助

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48537
 
1570 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    5 年前

您需要对请求中消息的主键(或其他属性)进行编码可以通过几种方式来实现:例如,通过在触发的url中对其进行编码,或者通过表单中的隐藏字段将其作为post参数发送。

例如,我们可以添加 message_id url的参数:

#urls.py

urlpatterns = [
    # …,
    path('my_form/<int:message_pk>', MyFormView.as_view(), name="form-view")
]

然后在表单中,我们可以使用参数,方法是在 self.kwargs :

#views.py

class MyFormView(FormView):
    form_class = CommentForm
    success_url = "/"

    def form_valid(self,form,*args,**kwargs):
        form.instance.message_id = self.kwargs['message_pk']
        self.object = form.save()
        return super(MyFormView, self).form_valid(form)

通过使用 消息id ,我们避免对数据库进行额外调用以获取相应的 Message 是的。

在为 MessageDetailView 视图 <form> 然后将需要使用一个URL作为操作URL,该URL具有消息的相应主键例如,如果上下文对象名是 'message' ,可以传递给:

<form action="{% url 'form-view' message_pk=message.pk %}" method="post">
    …
</form>