繁体   English   中英

登录后重定向到注释部分在Django中不起作用

[英]redirecting to comment section after login is not working in django

如果用户已经登录,它将保存并在options.html页面上显示注释,但是当用户在注释部分重定向到登录页面后登录时,它将显示错误值,如下所示:
在/ rank / best-trekking-destination-nepal / comment /中的NoReverseMatch
找不到带有参数“('',)”的“注释”。 尝试了1个模式:['排名/(?P [^ /] +)/评论/ $']
请求方法:GET
请求网址: http//127.0.0.18000 / rank / best-trekking-destination-in-nepal / comment /
Django版本:2.1.5
异常类型:NoReverseMatch
异常值:
找不到带有参数“('',)”的“注释”。 尝试了1个模式:['排名/(?P [^ /] +)/评论/ $']

urls.py

 path('<slug>/',views.options,name='options'),
 path('<slug>/comment/',views.comment,name='comment'),

views.py

def options(request,slug):
    category = Category.objects.get(slug=slug)
    category.views += 1
    category.save()
    options = category.option_set.all().order_by('-votes')
    try:
        for option in options:
            option.has_voted = option.vote_set.filter(voter=request.user).exists()
    except:
        options = category.option_set.all().order_by('-votes')


    form = CommentForm()
    return render(request, 'rank/options.html', {'options': options,'form':form,'title': 'options','category':category})



 @login_required(redirect_field_name='next',login_url='rank:login')
def comment(request,slug):
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.category = Category.objects.get(slug=slug)
            comment.user = request.user
            comment.save()
            messages.success(request, 'Comment Posted.')
            return redirect('rank:options', slug)
    else:
        form = CommentForm()
    return render(request, 'rank/options.html', {'form': form})

def my_login(request):
    if request.method == "POST":
        form = LoginForm(request.POST)
        username = form['username'].value()
        password = form['password'].value()
        user = authenticate(username=username,password=password)
        if user:
            login(request,user)
            redirect_url = request.GET.get('next','rank:home')
            return redirect(redirect_url)
        else:
            messages.error(request,'Invaid Username or Password')

    else:
        form = LoginForm()
    return render(request,'rank/login.html',{'form':form})

options.html

{% extends "rank/base.html" %}
 <title>{% block title %}{{title}}{% endblock title%}</title>
{% load bootstrap4 %}
{% block content %}
<center><br>
     <ol type="1">
          <center>{% bootstrap_messages %}</center>
    {% for option in options %}

     <div class="col-lg-6 col-md-6 mb-6">
              <div class="card h-100">
                <div class="card-body">
                    <b><li>
                  <img src="/media/{{option.image}}" width="400" height="300">
                 <h4>{{option.name}}
                  </h4>
                  <h5 class="card-text">{{ option.details}}</h5>
                      <h5>{{ option.votes }} votes</h5>
                       {% if option.has_voted %}
                             <p class="btn btn-success">Voted</p>
                       {% else %}
                            <form action="{% url 'rank:vote' option.slug %}" method="post">
                           {% csrf_token %}
                       <input type="submit" class="btn btn-success" value="Vote" >
                       </form>
                       {% endif %}

                         </li></b>
                </div>
                <div class="card-footer">
                  <small class="text-muted"></small>
                </div>


              </div>
                </div>
         {% empty %}
    <div class="card w-100">
    <div class="card-body">
        <h4>Item not available</h4>
    </div>
    </div>

    {% endfor %}
     </ol>

<h3>{{ category.comment_set.all|length}} comments</h3>
    <hr>
            {% for c in category.comment_set.all %}
                  <div class="col-lg-6 col-md-6 mb-6">
                     <div class="card-footer text-muted">
                         <b>{{ c.user.username}} </b>&nbsp {{c.created|timesince}} ago
              </div>
              <div class="card-body">
                <p class="card-text">{{ c.comment}}</p>
              </div>

            </div>
            {% endfor %}

    <hr>
   <div class="col-lg-6 col-md-6 mb-6">
            <form method="post" action="{% url 'rank:comment' category.slug %}">
                {% csrf_token %}
            {% bootstrap_form form %}
            <input type="submit" class="btn btn-success" value="Post Comment">
            </form>
     </div>



</center>




{% endblock content%}

您在views.py comment功能不完整。 您不在那里处理GET和其他类型的请求:

@login_required(redirect_field_name='next',login_url='rank:login')
def comment(request,slug):
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.category = Category.objects.get(slug=slug)
            comment.user = request.user
            comment.save()
            messages.success(request, 'Comment Posted.')
            return redirect('rank:options',slug)   
    else:
        form = CommentForm()
    return render(request,'...some_template',{'form':form})

更新 :发生下一个错误NoReverseMatch ,因为可变的category (以及options )没有从视图发送到options.html模板,因此在模板中为null( arguments '('',)' not found )。 您可以这样解决:

@login_required(redirect_field_name='next',login_url='rank:login')
def comment(request,slug):
   if request.method == "POST":
       form = CommentForm(request.POST)
       if form.is_valid():
           comment = form.save(commit=False)
           comment.category = Category.objects.get(slug=slug)
           comment.user = request.user
           comment.save()
           messages.success(request, 'Comment Posted.')
           return redirect('rank:options', slug)
   else:
       form = CommentForm()
   category = Category.objects.get(slug=slug)
   options = category.option_set.all().order_by('-votes')
   return render(request, 'rank/options.html', {'options': options,'form':form,'title': 'options','category':category})
@login_required(redirect_field_name='next',login_url='rank:login')
def comment(request,slug):
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.category = Category.objects.get(slug=slug)
            comment.user = request.user
            comment.save()
            messages.success(request, 'Comment Posted.')
            return redirect('rank:options',slug)

    return redirect('some default view')

如果您的POST请求视图失败或该表单无效,则无需向视图的每个分支添加视图。 我输入了需要完成的代码行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM