如何解决处无逆向比赛
我尝试在问题回答后重定向到问题detailView,但我明白了
位于/ 98afdfc7-df41-416c-aaae-c1014bfbf119 / answer
的NoReverseMatch未找到带有参数'('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>
解决方法
答案的id
不是UUID
。确实,在您的Answer
模型中,您没有指定主键,在这种情况下,Django automatically adds a primary key that is an AutoField
:
默认情况下,Django为每个模型提供以下字段:
id = models.AutoField(primary_key=True)
因此,这意味着self.id
中的Answer
(不是Question
)是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_url
中的Answer
旨在引用Question
的详细视图。由于get_absolute_url()
应该返回规范网址,因此get_absolute_url()
的工作方式并非如此。
如果要指定Question
的ID,请使用:
class Answer(models.Model):
# …
def get_absolute_url(self):
return reverse('question_detail',args=(self.question_id,))
在那种情况下,路径当然应该使用uuid
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。