【问题标题】:In Django how to initialize a form with the current detailview object?在 Django 中,如何使用当前的 detailview 对象初始化表单?
【发布时间】:2021-11-27 03:49:09
【问题描述】:

我是一个建立博客网站的 Django 初学者。

模型是:博客、主题、评论。 博客有话题,每个话题都有评论。

从线程详细信息视图中,登录的用户可以使用表单创建评论。 创建的 Comment 应该使用当前 detailview 线程对象初始化其“thread”值,因为 thread 是 Comment 模型中 Thread 模型的外键。

在评论创建视图中,我尝试使用 form.instance.thread = self.kwargs['pk'] 但它带来了这个错误:KeyError at /blogs/comment/创建/'pk'.

你能帮我把线程传递给表单吗?

models.py:

class Comment(models.Model):
    comment_date = models.DateField(default=datetime.date.today, blank=True)
    comment_text = models.TextField(max_length=1000, help_text='Enter your comment')
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)    
    thread = models.ForeignKey('Thread', on_delete=models.SET_NULL, null=True)
    class Meta:
        verbose_name = 'comment'
        verbose_name_plural = 'comments'           
    def __str__(self):
        return f'{self.id} ({self.thread.thread_name})'
    def get_absolute_url(self):      
        return reverse('comment-detail', args=[str(self.id)])

class Thread(models.Model):
    thread_name = models.CharField(max_length=200)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    summary = models.TextField(max_length=1000,)
    post_date = models.DateField(null=True, blank=True)    
    blog = models.ForeignKey('Blog', on_delete=models.CASCADE, null=True)    
    class Meta:
        ordering = ['-post_date']
    def __str__(self):
        return self.thread_name
    def get_absolute_url(self):
        return reverse('thread-detail', args=[str(self.id)])

urls.py:

path('thread/<int:pk>/', views.ThreadDetailView.as_view(), name='thread-detail')
path('comment/create/', views.CommentCreate.as_view(), name='comment_create')

views.py:

class ThreadDetailView(generic.DetailView):
    model = Thread


class CommentCreate(LoginRequiredMixin, CreateView):   
    model = Comment
    fields = ['comment_text', 'thread']     
  
    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.thread = self.kwargs['pk'] # This doesn't work
        return super(CommentCreate, self).form_valid(form)

【问题讨论】:

  • KeyError 表示你的self.kwargs字典中不存在key pk
  • 感谢您的评论 Ankit Tiwari,这是否意味着 self.kwargs 不是将线程值传递给创建的评论对象的正确方法?或者有没有办法将密钥 pk 获取到 self.kwargs 字典?

标签: django forms detailview


【解决方案1】:

我终于找到了另一种解决问题的方法:

  • 通过在评论创建视图中初始化线程外键:

     def CommentCreate(request, thread_id):
        thread = Thread.objects.get(id=thread_id)
        form = Commentform(request.POST or None, initial={'thread': thread})
        ....```
    
    
  • 通过在模板中传递线程 id,创建视图被调用:

   <a href="{% url 'comment_create' thread.pk %}">  Create a New Comment</a> 
  • 在视图的 url 中:

    path('thread/<thread_id>/commentcreate/', views.CommentCreate, name='comment_create'),
    
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多