перенаправление в раздел комментариев после того, как логин не работает в Django - PullRequest
0 голосов
/ 13 марта 2019

сохраняет и отображает комментарии на странице options.html, если пользователь уже вошел в систему, но когда пользователь входит в систему после того, как раздел комментариев перенаправляет на страницу входа, он отображает значение ошибки следующим образом:
NoReverseMatchat / rank / best-trekking-destination-in-nepal / comment /
Реверс для «комментария» с аргументами («,,)» не найден.Попробован 1 шаблон (ов): ['rank / (? P [^ /] +) / comment / $']
Метод запроса: GET
Запрос URL: http://127.0.0.1:8000/rank/best-trekking-destination-in-nepal/comment/
Версия Django: 2.1.5
Тип исключения: NoReverseMatch
Значение исключения:
Реверс для «комментария» с аргументами ((',,)' не найден).Приведено 1 рисунков: ['rank / (? P [^ /] +) / comment / $']

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%}

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вы comment функция в views.py не завершена. вы не обрабатываете 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 произошла из-за того, что vairable category (а также options) не отправляется из представлений в шаблон options.html и поэтому в шаблоне он равен нулю ( 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})
0 голосов
/ 13 марта 2019
@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-запроса завершается неудачно или форма недействительна, тогда представление не возвращается. Я поставил строку кода, которую нужно завершить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...