我遵循项目的教程,但它是在函数视图上进行的,我试图在基于类的视图上进行
我得到了一个(视图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>
2条答案
按热度按时间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/
““”
knsnq2tg2#
我知道已经很久了,但我想将来有人可能需要答案。
我用的是Django3.2.16。
在DetailView内部post方法中:
将您的post方法更新为: