Django点击问题作者名跳转公共主页路由反向解析报错
报错根因
报错Reverse for 'Public_Profile' with arguments '('',)' not found是多处代码逻辑错误叠加导致:
- 首页index视图把上下文字典错误包裹在列表中传给模板,模板无法正常解析变量
- 模板跳转链接使用了未定义的
profile.slug变量,没有取当前问题发布者对应的Profile slug,导致传入路由的参数为空字符串 - Profile模型slug生成、public_profile视图查询存在逻辑隐患,即使跳转成功也会出现数据查询错误
分步修复方案
1. 修复index视图的上下文传值逻辑
去掉context外层的列表包裹,render函数接收字典格式的上下文即可,修正后代码:
@login_required(login_url='login') def index(request): query = request.GET.get('q', None) list_of_question = Question.objects.all() if query is not None: list_of_question = Question.objects.filter( Q(title__icontains=query) | Q(category__name__icontains=query) ) unread_notifications = Notification.objects.filter(user=request.user, is_read=False).count() paginator = Paginator(list_of_question, per_page=15) context = { 'unread_notifications':unread_notifications, 'list_of_question':list_of_question, 'paginator':paginator } return render(request, 'index.html', context)
2. 修复模板中个人主页跳转参数
循环渲染问题时,通过问题关联的发布者用户,取对应的Profile slug,替换原来不存在的profile.slug变量,修正后模板对应代码:
<div class="container"> <div class="row justify-content-center"> {% for question in list_of_question reversed %} <div class="col-md-4"> <div class="card my-3"> <div class="card-header"> <p class="card-title"><a href="{% url 'Public_Profile' question.user.profile.slug %}"> {{question.user.username.upper}} </a></p> </div> <div class="card-body"> <a href="{% url 'view-Question' question.slug %}" style="text-decoration: none;"> <p class="card-title">{{question.title}}</p> </a> <h5>{{question.category}}</h5> </div> </div> </div> {%endfor%} </div> </div>
3. 修复Profile模型的slug生成逻辑
显式指定取用户名字段生成slug,避免直接对User对象转义出现异常,修正后模型代码:
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='static/default.jpg') stories = RichTextField(blank=True, null=True) twitter = models.URLField(max_length=300, blank=True, null=True) website = models.URLField(max_length=300,blank=True, null=True) city = models.CharField(max_length=50, blank=True, null=True) location = models.CharField(max_length=80, blank=True, null=True) slug = models.SlugField(unique=True, max_length=200) def save(self, *args, **kwargs): self.slug = slugify(self.user.username) super(Profile, self).save(*args, **kwargs) def __str__(self): return str(self.user)
4. 修复public_profile视图的查询逻辑
原查询条件user=contents逻辑错误,contents本身是Profile实例,关联用户属性为contents.user,修正后代码:
def public_profile(request, slug): contents = get_object_or_404(Profile, slug=slug) questions = Question.objects.filter(user=contents.user) context = { 'contents':contents, 'questions':questions } return render(request, 'public_profile.html', context)
额外注意
需要保证每个注册用户都对应生成一条Profile记录,否则模板取question.user.profile时会抛出关联对象不存在的错误,可以通过Django信号在User创建时自动创建关联Profile。
内容的提问来源于stack exchange,提问作者user19255291
相关产品推荐
相关产品推荐

