无反向匹配

No Reverse Match at

我尝试在回答问题后重定向到问题详细视图,但我得到了

NoReverseMatch 在 /98afdfc7-df41-416c-aaae-c1014bfbf119/answer

'question_detail' 的反转,未找到参数“('87',)'。尝试了 1 种模式:['questions/(?P[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$']

输入我的答案后

型号

class Question(models.Model):
    id = models.UUIDField(_("ID"), primary_key=True,
                          default=uuid.uuid4, editable=False)
    question = models.CharField(_("Question"), max_length=300)


    def get_absolute_url(self):
        return reverse('question_detail', args=[str(self.id)])


class Answer(models.Model):
    question = models.ForeignKey(Question, verbose_name=_(
        "Answer"), on_delete=models.CASCADE, related_name='answers')
    answer = models.CharField(max_length=255)


    def get_absolute_url(self):
        return reverse('question_detail', args=[str(self.id)])

网址

urlpatterns = [
    path('<uuid:pk>/answer', AnswerQuestionView.as_view(), name='answer'),
    path('questions/<uuid:pk>', QuestionDetailView.as_view(),
         name='question_detail'),
]

观看次数

class AnswerQuestionView(CreateView):
    model = Answer
    context_object_name = 'answer'
    fields = ['answer', 'question']
    template_name = "forms/answer.html"
   

class QuestionDetailView(DetailView):
    model = Question
    context_object_name = 'question'
    template_name = "question_detail.html"

HTML形式

<form method="post">
    {% csrf_token %}
{{form.as_p}}
<button value="submit">Post</button>
</form>

你的答案 id 不是 UUID。实际上,在您的 Answer 模型中您没有指定主键,在这种情况下 Django automatically adds a primary key that is an AutoField:

By default, Django gives each model the following field:

id = models.AutoField(primary_key=True)

这意味着 Answer(不是 Question)的 self.idint,因此这与 [=19 不匹配=]路径的路径转换器:

urlpatterns = [
    path(
        '<uuid:pk>/answer/',
        AnswerQuestionView.as_view(),
        name='answer'
    ),
    path(
        'questions/<<b>int:</b>pk>/',  # ← use int, not <s>uuid</s>
        QuestionDetailView.as_view(),
        name='question_detail'
    ),
]

也可以尝试迁移数据改用uuid,但是既然已经有数据,迁移会比较痛苦。

编辑:不过,看起来您的 Answerget_absolute_url 旨在参考 Question 的详细视图。由于 get_absolute_url() 应该 return 是 规范的 url,这并不是 get_absolute_url() 应该如何工作。

如果要指定Question的id,则使用:

class Answer(models.Model):
    # …
    
    def get_absolute_url(self):
        return reverse('question_detail', args=<b>(self.question_id,)</b>)

在那种情况下,路径当然应该使用 uuid.