简体   繁体   English

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

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

it saves and displays comments on the options.html page if the user is already logged in but when the user logs in after comment section redirects to the login page it displays the value error as this: 如果用户已经登录,它将保存并在options.html页面上显示注释,但是当用户在注释部分重定向到登录页面后登录时,它将显示错误值,如下所示:
NoReverseMatch at /rank/best-trekking-destination-in-nepal/comment/ 在/ rank / best-trekking-destination-nepal / comment /中的NoReverseMatch
Reverse for 'comment' with arguments '('',)' not found. 找不到带有参数“('',)”的“注释”。 1 pattern(s) tried: ['rank/(?P[^/]+)/comment/$'] 尝试了1个模式:['排名/(?P [^ /] +)/评论/ $']
Request Method: GET 请求方法:GET
Request URL: http://127.0.0.1:8000/rank/best-trekking-destination-in-nepal/comment/ 请求网址: http//127.0.0.18000 / rank / best-trekking-destination-in-nepal / comment /
Django Version: 2.1.5 Django版本:2.1.5
Exception Type: NoReverseMatch 异常类型:NoReverseMatch
Exception Value: 异常值:
Reverse for 'comment' with arguments '('',)' not found. 找不到带有参数“('',)”的“注释”。 1 pattern(s) tried: ['rank/(?P[^/]+)/comment/$'] 尝试了1个模式:['排名/(?P [^ /] +)/评论/ $']

urls.py urls.py

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

views.py 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 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%}

you comment function in views.py is incomplete. 您在views.py comment功能不完整。 you don't handle GET and other types of request in there: 您不在那里处理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})

UPDATE : your next error NoReverseMatch is occured because vairable category (and also options ) not send from views to the options.html template and therefor it is null in the template ( arguments '('',)' not found ). 更新 :发生下一个错误NoReverseMatch ,因为可变的category (以及options )没有从视图发送到options.html模板,因此在模板中为null( arguments '('',)' not found )。 you can fix that like this: 您可以这样解决:

@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')

You need to add a view to each branch of computation if your POST request view fails or the form is not valid then a view is not returned. 如果您的POST请求视图失败或该表单无效,则无需向视图的每个分支添加视图。 I put a line of code you need to finish off. 我输入了需要完成的代码行。

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

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