【问题标题】:Django class based view and comments基于 Django 类的视图和评论
【发布时间】:2016-03-29 03:37:57
【问题描述】:

我无法将 cmets 添加到基于类的视图中, forms.py:

  class RequestForm(ModelForm):
      class Meta:
          model = Request
          exclude = ('slug',)
  class RequestCommentForm(ModelForm):
      class Meta:
          model = RequestComment
          fields = ['body' ]

models.py:

class Request(models.Model):
    title = models.CharField(max_length=250 )
    date = models.DateTimeField('Request date', default=timezone.now, editable=False )
    department = models.CharField(max_length=2, choices=DEPARTMENT)
    support_request = models.TextField('Request', max_length=2500, blank=True)
    owner = models.ForeignKey(User,)
    slug = models.SlugField(blank=True, editable=False)

    def __unicode__(self):
        return self.title

views.py:

class RequestDetailView(ModelFormMixin, DetailView):
    model = Request
    form_class = RequestCommentForm

    def get_success_url(self):
        return reverse('request-detail', kwargs={'pk': self.object.pk})

    def get_context_data(self, **kwargs):
        context = super(RequestDetailView, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.request = Request.objects.get(pk=self.object.pk)
        form.instance.created = timezone.now
        form.save()
Also tried this part with:
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.request = Request.objects.get(pk=self.object.pk)
        self.object.created = timezone.now
        self.object.save()
        return super(RequestDetailView, self).form_valid(form)

模板:request_detail.html cmets 部分.....

{% load bootstrap %}
<form action="{% url 'request-detail' object.id %}" method="post"> {% csrf_token %}
        <ul class="form-group">
        {{ form|bootstrap }}
        </ul>
        <input class="btn btn-primary" type="submit" value="Submit" />
</form>

.....

页面呈现正确,但是当我提交时,无法保存评论。

调试工具栏显示 sql 查询正在更新请求模型,而不是请求注释。

不知道如何将来自不同模型的简单评论表单添加到详细信息页面。 任何帮助将不胜感激。

另外,如果有更优雅的方式将 cmets 表单添加到基于类的视图中,我很乐意看到它。我的 google-fu 没有帮助我找到任何东西。

【问题讨论】:

  • 在您的代码中:orm.instance.request = Request.objects.get(pk=self.object.pk) 应该是 form.instance.request = Request.objects.get(pk=self.object.pk)
  • 这只是复制粘贴并删除评论##错字。已在原帖中修复。不是实际问题...
  • 无法弄清楚如何用 CBV 做到这一点,使它与简单的功能视图一起工作..

标签: django django-class-based-views


【解决方案1】:

我知道我回答这个问题为时已晚,但也许将来有同样问题的人可能会受益。

Class RequestDetailView(DetailView):
    model = Request
    template_name = 'detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context ['comment'] = RequestComment.objects. all()
        context['form'] = RequestCommentForm()
        return context


Class CommentCreateView(CreateView):
    model = RequestComment
    form_class = RequestCommentForm

    def get_success_URL(self):
        return reverse ('request: detail', kwargs = {'slug':self.object.post.slug})

    def form_valid(self, form):
        post = get_object_or_404(Request, slug = self.kwargs ['slug'])
        Form.instance.post = Request
        return super().form_valid(form)

网址

path('<slug:slug>/add_comment/', CommentCreateView.as_view(), name = add_comment')

最后是 HTML

    <form action="{% url 'request:add_comment' request.slug %}" enctype = "multiparty/form-data" method = "post">
    </form>

就是这样。我是用手机回答的,所以有一些错别字等。这是我在这里的第一个答案,我搜索了堆栈溢出的答案,稍后我会发布链接。我假设 RequestComment 外键字段是 post 并且在 Django 中不鼓励创建名称为“request”的模型。

【讨论】:

    【解决方案2】:

    希望我能找到一种使用 CBV 的方法,但不行.. 函数视图效果很好...

    class RequestDetailView(ModelFormMixin, DetailView):
        model = Request
        form_class = RequestCommentForm
    
        def get_success_url(self):
            return reverse('request-detail', kwargs={'pk': self.object.pk})
    
        def get_context_data(self, **kwargs):
            context = super(RequestDetailView, self).get_context_data(**kwargs)
            context['form'] = self.get_form()
            return context
    
        def comments(self):
            return RequestComment.objects.filter(request=Request.objects.get(pk=self.object.pk))
    
    
    def RequestCommentAddView(request, pk):
        form = RequestCommentForm(request.POST or None)
    
        if form.is_valid() and pk:
            form.instance.author = request.user
            form.instance.request = Request.objects.get(pk=pk)
            form.save()
            return HttpResponseRedirect(reverse('request-detail', kwargs={'pk': pk}))
        return HttpResponseRedirect(reverse('request-detail', kwargs={'pk': pk}))
    

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2011-01-23
      • 2014-02-16
      • 1970-01-01
      相关资源
      最近更新 更多