无反向匹配
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.id
是 int
,因此这与 [=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,但是既然已经有数据,迁移会比较痛苦。
编辑:不过,看起来您的 Answer
的 get_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
.
我尝试在回答问题后重定向到问题详细视图,但我得到了
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.id
是 int
,因此这与 [=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,但是既然已经有数据,迁移会比较痛苦。
编辑:不过,看起来您的 Answer
的 get_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
.