我在DetailView中尝试使用FormMixins并获得了我的表单,但问题显然是他们根本没有相同的视图,或者至少不是相同的URL,所以这是如何工作的?我也尝试过在类中使用post()函数。
您如何在同一页面上的多个位置管理您需要的表单(最好使用基于内置类的视图)并仍然可以获得详细模型的ID?
编辑:实际上我们在堆栈上有完全相同的例子,堆栈如何能够在任何地方都有答案/评论表格?
Edit2:感谢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)
answerform
class AnswerForm(forms.ModelForm):
content = forms.CharField(widget=PagedownWidget())
class Meta:
model = Answer
fields = ('content',)
URL
path('subject/<slug>', PostDetailView.as_view(), name='postdetail'),
我在Post的模型中有get_absolute_url,&#34; postdetail&#34;。
为了补充我得到的答案,我想告诉你这个https://docs.djangoproject.com/en/2.0/topics/class-based-views/mixins/#an-alternative-better-solution
答案 0 :(得分:0)
在使用post
保存表单后,您可以在created_by
方法中设置form_valid
和commit=False
字段。有关详细信息,请参阅the model form save method上的文档。
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):
如果您希望所有用户都能够访问该视图,但只有登录用户才能提交表单,那么它会变得更加复杂。我将把它作为练习留给读者,但请注意using FormMixin with DetailView上的文档最终决定创建一个单独的视图来处理帖子请求。