<p>当您在一个视图/url路径中处理多个对象时,使用描述性名称总是很方便的:使用<code>question_id</code>而不是<code>id</code>,这样它就不同于<code>answer_id</code>,您以后可能需要它:<code>/politics_post/<int:question_id>/answers/<int:answer_id>/change/</code></p>
<p>这些名字只是标签。它们保存在CreateView的<code>kwargs</code>属性中。因此<code>/politics_post/42/answers/59/change</code>将创建:
<code>CreateView.kwargs = {'question_id': 42, 'answer_id': 59}</code>。更多信息请参见<a href="https://docs.djangoproject.com/en/3.0/topics/class-based-views/generic-display/#dynamic-filtering" rel="nofollow noreferrer">the docs</a></p>
<p>正如@crimsonpython24所说,您可以从问题的角度来做这件事,但使用答案作为您的模型也同样好。现在,我假设您将url更改为具有问题id。您将更改您的创建视图,如下所示:</p>
<pre class="lang-py prettyprint-override"><code>class CreateAnswer(LoginRequiredMixin,CreateView):
model = Answer
fields = ['content']
context_object_name = 'answer'
success_url = reverse_lazy('Lisk home')
question_kwarg = 'question_id'
def form_valid(self, form):
try:
question = Question.objects.get(pk=self.kwargs[self.question_kwarg])
except Question.DoesNotExist:
form.add_error(None, 'Invalid question')
return self.form_invalid(form)
form.instance.question = question
form.instance.author = self.request.user
return super().form_valid(form)
</code></pre>