django.urls.exceptions.NoReverseMatch用于用户名,但参数在那里

时间:2018-04-04 15:29:37

标签: python django django-templates django-urls

django.urls.exceptions.NoReverseMatch
django.urls.exceptions.NoReverseMatch: Reverse for 'for_user' with keyword arguments '{'username': ''}' not found. 1 pattern(s) tried: ['questions/by/(?P<username>[-\\w]+)/$']

我得到了一个没有反向匹配的错误,但是从我所知道的,所有必要的东西都存在。我有一个url,它有来自html的username参数,并被保存到模型中并通过视图表示。

我还是一个django新手。所有的帮助表示赞赏。

文件结构

usertest - root
-->accounts - appname
-->questions - appname
  -->urls.py
  -->views.py
  -->model.py
templates
-->base.html

urls.py

    url(r'by/(?P<username>[-\w]+)/$', views.UserQuestions.as_view(), name="for_user"),

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

model.py

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,

            }
        )

views.py

class UserQuestions(generic.ListView):
    model = models.Question
    template_name = "questions/user_question_list.html"



    def get_queryset(self):
        try:
            self.question_user = 
              User.objects.prefetch_related("questions").get(
                 username__iexact=self.kwargs.get("username")
            )
        except User.DoesNotExist:
            raise Http404
        else:
            return self.question_user.questions.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["question_user"] = self.question_user
        return context

1 个答案:

答案 0 :(得分:1)

{% url 'questions:for_user' username=question.user.username %}

要使此网址生效,您需要question位于模板上下文中。这意味着您的视图应该类似于:

def view_question(request):
    question = Question.objects.get(text="What is your name?")
    return render(request, "template.html", {'question': question})

错误消息with keyword arguments '{'username': ''}'表明模板上下文中缺少question

当我第一次看到您的网址标记时,我想知道您是否尝试遍历查询集中的所有问题,例如:

{% for question in question_loop %}
    {% url 'questions:for_user' username=question.user.username %}
{% endfor %}

这就是为什么我问url标签是否在循环中。

现在您已经扩展了问题,听起来您想要登录用户的用户名。 auth context processoruser添加到模板上下文中,因此您可以使用user.username来获取用户名。

{% url 'questions:for_user' username=user.username %}

但是,您的基本模板应该可以处理未登录的用户。您可以添加if语句以避免匿名用户出错。

{% if user.is_authenticated %}    
    {% url 'questions:for_user' username=user.username %}
{% endif %}