想知道是否可以在UpdateView中预填充我的CommentForm。更新注解工作,除非该表单未加载预填充。
当使用一个单独的模板测试时,它是预填充的,但是我想使用同一个模板(PostDetail),使用一个模式来更新评论。
views.py:
class PostDetail(View):
def get(self, request, slug, pk, *args, **kwargs):
queryset = Post.objects.all()
post = get_object_or_404(queryset,slug=slug, pk=pk)
comments = post.comments.order_by('-created_on')
return render(
request,
'blog/post_detail.html',
{
'post': post,
'comments': comments,
'comment_form': CommentForm()
},
)
def post(self, request, slug, pk, *args, **kwargs):
if request.user.is_authenticated:
queryset = Post.objects.all()
post = get_object_or_404(queryset, slug=slug, pk=pk)
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
messages.info(request, 'Comment added')
return HttpResponseRedirect(reverse('post_detail', args=[slug, pk]))
class CommentUpdate(LoginRequiredMixin, UserPassesTestMixin, generic.UpdateView):
model = Comment
template_name = 'blog/post_detail.html'
form_class = CommentForm
def get_success_url(self):
post = Post.objects.get(pk=self.object.post.pk)
messages.info(self.request, 'Comment updated')
return post.get_absolute_url()
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
comment = self.get_object()
if self.request.user == comment.author:
return True
return False`
forms.py:
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('body',)
post_详细信息. html(表单):
<form action="{% url 'comment_update' post.slug comment.pk %}" method="POST">
{% csrf_token %}
{{ comment_form | crispy }}
<button type="submit" class="btn">Update</button>
</form>
请帮助:)
我已测试添加:
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['instance'] = self.get_object()
return kwargs
表单尚未预填充。如果使用单独的模板并使用{{ form}呈现表单,则可以正常工作|脆的}}。
也许是因为我有两个{{ comment_form|crispy }}在我的post_detail. html中,一个在创建评论时,一个在更新评论时?
我已经花了很多时间试图弄清楚这一点:)
1条答案
按热度按时间rsl1atfo1#
您可以在
CommetForm
中传递您想要更新的Comment
模型示例。在get_form_kwargs()
方法中,您可以将instance
关键字参数添加到表单kwargs中,其中包含要更新的Comment模型示例。然后,CommentForm
将在前端显示时使用该示例中的数据进行预填充,因此: