Python django.url.exceptions.NoReverseMatch用于用户名,但有参数

Python 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

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">
        <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 %}