1

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

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

未找到带有参数“('87',)'的'question_detail'的反向。尝试了 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>
4

1 回答 1

1

您的id答案不是UUID. 实际上,在您的Answer模型中,您没有指定主键,在这种情况下,Django 会自动添加一个主键,即AutoField

默认情况下,Django 为每个模型提供以下字段:

id = models.AutoField(primary_key=True)

因此,这意味着self.idan Answer(不是 a Question)是 an int,因此这将与路径的uuid路径转换器不匹配:

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

您也可以尝试迁移数据以使用 uuid 代替,但由于已经有数据,迁移会更加痛苦。

编辑:但是看起来您get_absolute_urlAnswer目的是参考Question. 由于 aget_absolute_url()应该返回一个规范的url,这并不是 aget_absolute_url()应该如何工作的。

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

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

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

于 2020-11-02T16:30:07.927 回答