django 如何在DetailView中执行POST请求

kadbb459  于 2022-12-01  发布在  Go
关注(0)|答案(2)|浏览(145)

我遵循项目的教程,但它是在函数视图上进行的,我试图在基于类的视图上进行
我得到了一个(视图blog.views.PostDetailView没有返回HttpResponse对象。它返回了None。)错误,但这不是我现在关心的问题...因为数据(新评论)没有被保存,所以我如何将它们与发布请求一起保存并重定向到DetailView的同一页面
我的网址

app_name = 'blog'

urlpatterns = [
    path('', views.PostListView.as_view(), name='blog-home'),
    path('blog/<slug:slug>/', views.PostDetailView.as_view() , name='post-detail'),
    ]

我的模型
第一次
我的表单

class AddCommentForm(forms.ModelForm):
    content = forms.CharField(label ="", widget = forms.Textarea( 
    attrs ={ 
        'class':'form-control', 
        'placeholder':'Comment here !', 
        'rows':4, 
        'cols':50
    })) 

    class Meta: 
        model = Comment 
        fields =['content']

我的观点

class PostDetailView( DetailView):
    model = Post
    context_object_name = 'post'
    template_name='blog/post_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        comments = Comment.objects.filter(post=self.object)
        context['comments'] = comments
        context['form'] = AddCommentForm()
        return context

    def post(self, request, *args, **kwargs):
        pass

    def form_valid(self, form):
        form.instance.author = self.post.author
        user_comment.post = self.post
        user_comment.save()
        return super().form_valid(form)

超文本标记语言

<form method="POST">
              <div class="col-12">
                <hr>
                {% with comments.count as total_comments %}
                  <legend class="border-bottom mb-4">{{total_comments }} comment{{total_comments|pluralize }}</legend>
                {% endwith %}
                {% for c in comments%}
                  <div class ="col-md-12 mb-1rem" >
                    <p class="mb-0"><strong>{{c.author}}:</strong> {{c.content}}</p>
                    <small class="text-muted">{{ c.publish_date|date:'f A, Y'}}</small>
                  </div>
                  <br>
               {% endfor %}
              </div>
              <hr>    
              {% csrf_token %}
              <fieldset class="form-group">
                  <legend class="border-bottom mb-4">New Comment</legend>
                  {{ form|crispy }}
              </fieldset>
              <div class="form-group">
                  <button class="btn btn-dark btn-lg mt-1" type="submit">Publish</button>
              </div>
            </form>
6rqinv9w

6rqinv9w1#

DetailView没有form_valid方法。它只显示模型的对象。
表单行程是在GenericEdit View类别中进行。
方法有很多,但是......在这段代码中,您可以创建一个GenericEdit视图(CreateView或UpdateView)url,在那里处理表单(form_valid),然后
success_url = reverse_lazy('form:detail')#在泛型编辑视图类中
返回模板。
综上所述,
1.在www.example.com中添加路径urls.py如下所示...👇
path('blog/<slug:slug>/update', views.PostUpdateView.as_view(), name='post-update')
1.在表单中添加更新或创建url action. ex. action="{% url 'blog:post-update' %}"
1.视图类的创建
ps。您也可以使用forms.py
““”
当你在django中使用类库视图时,建议参考这个站点。https://ccbv.co.uk/
而且,DetailView引用此处为https://ccbv.co.uk/projects/Django/3.0/django.views.generic.detail/DetailView/
““”

knsnq2tg

knsnq2tg2#

我知道已经很久了,但我想将来有人可能需要答案。
我用的是Django3.2.16。
在DetailView内部post方法中:
将您的post方法更新为:

def post(self, request, *args, **kwargs):
    # Get the current pk from the method dictionary
    pk = kwargs.get('pk')
        
    if request.method == 'POST':
        
        # Get the current object
        obj = self.model.objects.get(id=pk)
        # Alter the field Value
        some_value = request.POST.get('some_value_from_html_input')
        obj.field = some_value
        # Save the object
        obj.save()
        
        # Redirect to you current View after update
        return redirect(current_details_view, pk=pk)

相关问题