我在 DetailView 中尝试使用 FormMixins 并获得了我的表单,但问题显然是它们根本不能具有相同的视图,或者至少不能具有相同的 URL,那么这是如何工作的呢?我还尝试在课堂上使用 post() 函数。
您将如何在同一页面的多个位置管理您需要的表单(最好使用内置的基于类的视图)并仍然让它接收详细模型的 id?
编辑:实际上我们在堆栈上有完全相同的示例,堆栈如何使到处都有答案/评论表单成为可能?
编辑 2:感谢 Alasdair,我现在有了以下代码,但得到错误 NOT NULL 约束失败 publish_answer.post_id
class PostDetailView(FormMixin, DetailView):
model = Post
form_class = AnswerForm
template_name = 'main/postdetail.html'
context_object_name = 'posts'
def get_context_data(self, **kwargs):
context = super(PostDetailView, self).get_context_data(**kwargs)
context['form'] = AnswerForm(initial={'post': self.object})
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.save()
return super(PostDetailView, self).form_valid(form)
答复表
class AnswerForm(forms.ModelForm):
content = forms.CharField(widget=PagedownWidget())
class Meta:
model = Answer
fields = ('content',)
网址
path('subject/<slug>', PostDetailView.as_view(), name='postdetail'),
我在 Post 模型中有 get_absolute_url,“postdetail”。
为了补充我得到的答案,我想通知您这个https://docs.djangoproject.com/en/2.0/topics/class-based-views/mixins/#an-alternative-better-solution
保存表单后,您可以在方法中设置post
和created_by
字段。有关更多信息,请参阅模型表单保存方法上的文档。form_valid
commit=False
def form_valid(self, form):
instance = form.save(commit=False)
instance.created_by = self.request.user
instance.post = self.object
instance.save()
return super(PostDetailView, self).form_valid(form)
您可能希望使用,LoginRequiredMixin
以便只有登录用户才能访问该视图。
from django.contrib.auth.mixins import LoginRequiredMixin
class PostDetailView(LoginRequiredMixin, FormMixin, DetailView):
如果您希望所有用户都能够访问视图但只有登录用户能够提交表单,那么它会变得更加复杂。我将把它留给读者作为练习,但请注意,有关将 FormMixin 与 DetailView一起使用的文档最终决定创建一个单独的视图来处理发布请求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句