python - 如何在 form_valid 中获取对象 ID?
问题描述
我正在尝试使用 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 的消息(或帖子)上发布每条评论,但我希望将评论发布在我看到的消息上。任何帮助表示赞赏
解决方案
您需要对请求中消息的主键(或其他属性)进行编码。您可以通过多种方式做到这一点:例如,通过在触发的 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)
通过使用message_id
,我们避免了对数据库进行额外调用来获取相应的Message
.
在您为MessageDetailView
视图呈现的模板中,<form>
将需要使用带有消息相应主键的 URL 作为操作 URL。例如,如果上下文对象名称是'message'
,您可以通过以下方式传递它:
<form action="{% url 'form-view' message_pk=message.pk %}" method="post">
…
</form>
推荐阅读
- android - 如何实现长按操作栏选项按钮
- c# - 使用列表在场景之间移动对象(MoveGameObjectToScene) - 初学者问题
- c - 使用多个 VBO 时,我是否不正确地初始化 VBO 或不正确地缓冲数据?
- java - 如何使对话框出现在我输入的提示中?
- javascript - React - 实时时钟不适用于初始值不同于 0
- c# - 如何在不使用单独变量的情况下获取引发事件的组件
- azure-blob-storage - 使用 Azure 数据工厂获取分区数据的最后修改日期
- tensorflow - 如何将带有类别(数组/列表)的熊猫数据框转换为张量流张量切片
- ios - 如何在 TargetOS 低于 9 的 iOS 应用中支持 TLS 1.2
- python - 在 Python 单元测试中修补/模拟时出现 AttributeError/"no attribute"