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
答案 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 processor将user
添加到模板上下文中,因此您可以使用user.username
来获取用户名。
{% url 'questions:for_user' username=user.username %}
但是,您的基本模板应该可以处理未登录的用户。您可以添加if语句以避免匿名用户出错。
{% if user.is_authenticated %}
{% url 'questions:for_user' username=user.username %}
{% endif %}