Python django.url.exceptions.NoReverseMatch用于用户名,但有参数
url.pyPython django.url.exceptions.NoReverseMatch用于用户名,但有参数,python,django,django-templates,django-urls,Python,Django,Django Templates,Django Urls,url.py usertest - root -->accounts - appname -->questions - appname -->urls.py -->views.py -->model.py templates -->base.html <nav class="navbar mynav" role="navigation" id="navbar"> <div class="container
usertest - root
-->accounts - appname
-->questions - appname
-->urls.py
-->views.py
-->model.py
templates
-->base.html
<nav class="navbar mynav" role="navigation" id="navbar">
<div class="container">
<a class="navbar-brand mynav" href="{% url 'questions:all' %}">WebSiteIcon</a>
<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li>hello {{ question.user }}</li>
<li><a href="{% url 'questions:create' %}" class="glyphicon glyphicon-plus-sign"></a></li>
<li><a href="{% url 'questions:all' %}" class="glyphicon glyphicon-home"></a></li>
<li><a href="{% url 'questions:for_user' username=question.user.username %}" class="glyphicon glyphicon-user"></a></li>
<li><a href="{% url 'accounts:logout' %}" class="btn btn-simple">Log out</a></li>
{% else %}
<li><a href="{% url 'accounts:login' %}" class="btn btn-simple">Log in</a></li>
<li><a href="{% url 'accounts:signup' %}" class="btn btn-simple">Sign up</a></li>
{% endif %}
</ul>
</div>
</nav>
<div class="container mycontent">
class Question(models.Model):
class Meta:
ordering = ['-date_updated']
user = models.ForeignKey(User, related_name="questions")
question = models.TextField(blank=False, null=False) # unique=True,
question_html = models.TextField(blank=False, null=False)
answer = models.TextField(blank=False, null=False)
answer_html = models.TextField(blank=False, null=False)
date_created = models.DateTimeField(auto_now=True, null=True)
date_updated = models.DateTimeField(auto_now=True, null=True)
slug = models.SlugField(unique=True, default='')
tags = TaggableManager()
def __str__(self):
return self.question
# ^ to display an object in the Django admin site and
# as the value inserted into a template when it displays an object.
def save(self, *args, **kwargs):
self.question_html = misaka.html(self.question)
self.answer_html = misaka.html(self.answer)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"questions:detail",
kwargs={
"slug": self.slug,
"pk": self.pk,
"username": self.user.username,
}
)
视图.py
usertest - root
-->accounts - appname
-->questions - appname
-->urls.py
-->views.py
-->model.py
templates
-->base.html
<nav class="navbar mynav" role="navigation" id="navbar">
<div class="container">
<a class="navbar-brand mynav" href="{% url 'questions:all' %}">WebSiteIcon</a>
<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li>hello {{ question.user }}</li>
<li><a href="{% url 'questions:create' %}" class="glyphicon glyphicon-plus-sign"></a></li>
<li><a href="{% url 'questions:all' %}" class="glyphicon glyphicon-home"></a></li>
<li><a href="{% url 'questions:for_user' username=question.user.username %}" class="glyphicon glyphicon-user"></a></li>
<li><a href="{% url 'accounts:logout' %}" class="btn btn-simple">Log out</a></li>
{% else %}
<li><a href="{% url 'accounts:login' %}" class="btn btn-simple">Log in</a></li>
<li><a href="{% url 'accounts:signup' %}" class="btn btn-simple">Sign up</a></li>
{% endif %}
</ul>
</div>
</nav>
<div class="container mycontent">
class Question(models.Model):
class Meta:
ordering = ['-date_updated']
user = models.ForeignKey(User, related_name="questions")
question = models.TextField(blank=False, null=False) # unique=True,
question_html = models.TextField(blank=False, null=False)
answer = models.TextField(blank=False, null=False)
answer_html = models.TextField(blank=False, null=False)
date_created = models.DateTimeField(auto_now=True, null=True)
date_updated = models.DateTimeField(auto_now=True, null=True)
slug = models.SlugField(unique=True, default='')
tags = TaggableManager()
def __str__(self):
return self.question
# ^ to display an object in the Django admin site and
# as the value inserted into a template when it displays an object.
def save(self, *args, **kwargs):
self.question_html = misaka.html(self.question)
self.answer_html = misaka.html(self.answer)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"questions:detail",
kwargs={
"slug": self.slug,
"pk": self.pk,
"username": self.user.username,
}
)
要使此url正常工作,您需要将问题
置于模板上下文中。这意味着您的视图应该类似于:
{% url 'questions:for_user' username=question.user.username %}
带有关键字参数“{'username':''}”的错误消息表明模板上下文中缺少question
当我第一次看到您的url标记时,我想知道您是否在尝试循环查询集中的所有问题,例如:
def view_question(request):
question = Question.objects.get(text="What is your name?")
return render(request, "template.html", {'question': question})
这就是为什么我问url标记是否在循环中
现在您已经展开了问题,听起来您需要登录用户的用户名。将user
添加到模板上下文中,因此您可以使用user.username
获取用户名
{% for question in question_loop %}
{% url 'questions:for_user' username=question.user.username %}
{% endfor %}
但是,基本模板可能也应该处理未登录的用户。可以添加if语句以避免匿名用户出错
{% url 'questions:for_user' username=user.username %}
您尚未显示完整的错误消息。如果url标记中使用了username=question.user.username
,那么question
设置在哪里?循环?然后显示循环。在基本模板中包含url标记真的是个好主意吗?这意味着,如果模板上下文不正确,则使用base.html
的每个视图都可能抛出错误。问题已更新。正如我所说,您的url标记使用username=question.user.username
,但是我没有看到你在任何地方设置问题。@Alasdair我已经再次更新了我的base.html,以显示我所拥有的全部内容。我不明白你在问什么“问题”是否设置在循环中?”根据我在后续教程中的理解,html从models.py或views.py中的模型中提取question.user.username。你能给我举个例子说明你的意思吗?
是否有更好的位置放置此url?我试着做一些类似于stackoverflow在搜索栏右侧的“用户活动”按钮的事情。这很有效!非常感谢。关于为什么我不需要“question.user.username”中的“question”,我仍然有点模糊。在我的其他URL中,我需要它作为'slug=question.slug'和'pk=question,pk'参数。更奇怪的是,我被指示在我正在遵循的另一个教程中使用它,它当时起了作用……所以它似乎有自己的想法。我将阅读更多关于URL参数和您指向我的auth context processor链接的内容。再次感谢!我试图在答案的开头解释这一点。如果在其他模板中使用question
,则在上述示例中,视图将在模板上下文中包括question
(例如{'question':question}
)。
{% if user.is_authenticated %}
{% url 'questions:for_user' username=user.username %}
{% endif %}