Ошибка NoReverseMatch Django

У меня есть следующая модель:

class UserPlaceReview(models.Model):
    place = models.ForeignKey(PlaceReview)
    review = models.TextField()

    def __str__(self):
        return self.review

class PlaceReview(models.Model):
    name      = models.CharField(max_length=150)
    location  = models.CharField(max_length=250)
    image     = models.ImageField(upload_to = image_upload_location,null=True, blank=True)
    category  = models.ForeignKey(Categories)
    slug =      models.SlugField()
    timestamp = models.DateTimeField(auto_now_add=True)
    updated   = models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("categories:detail", kwargs={"slug": self.slug})

В моем основном urls.py у меня есть следующий URL-адрес:

url(r'^categories/', include('places.urls', namespace='categories')),

и в моем приложении urls.py у меня есть следующий URL-адрес:

url(r'^(?P<slug>[\w-]+)/review/$', user_place_review, name='user_review'),

В шаблоне я пытаюсь сделать что-то подобное, что дает мне ошибку обратного совпадения:

 <a class="btn btn-primary btn-lg" href="{% url 'categories:user_review' %}">Write A Review!</a>

Представление, связанное с URL-адресом:

def user_place_review(request,slug):
    place = PlaceReview.objects.get(slug=slug)

    form = UserPlaceReviewForm(request.POST or None)
    if form.is_valid():
        instance = form.save(commit=False)
        review = form.cleaned_data['review']
        instance.place = place
        instance.review = review
        instance.save()
        return redirect('/')




    context = {
    "form": form,
    }



    return render(request,"places/user_review.html", context)

Не могу найти причину ошибки.


person indexOutOfBounds    schedule 01.08.2017    source источник


Ответы (2)


Изменить эту строку

 <a class="btn btn-primary btn-lg" href="{% url 'categories:user_review' %}">Write A Review!</a>

to

 <a class="btn btn-primary btn-lg" href="{% url 'categories:user_review' slug=placereview_instance.slug %}">Write A Review!</a>

Где placereview_instance — объект вашей модели. Вы определили URL-адрес user_review с аргументом ключевого слова slug в файле urls.py. Таким образом, Django ищет слаг аргумента ключевого слова в этом URL-адресе в шаблоне. Он не может найти то же самое, поэтому он выдает обратное совпадение не найдено.

Также, как вы уже определили get_absolute_url в models.py. Таким же образом вы можете напрямую использовать другой метод для просмотра, а затем использовать в шаблонах,

 <a class="btn btn-primary btn-lg" href="{{ placereview_instance.get_review_absolute_url }}">Write A Review!</a>
person Aniket Pawar    schedule 01.08.2017
comment
instance.get_absolute_url не работает, так как я добавил (slug)/review в свой URL-адрес. Это будет держать меня на той же странице и не приведет меня к /review - person indexOutOfBounds; 01.08.2017
comment
Большое спасибо. Другой вариант, в котором мы передаем слаг из нашего экземпляра, работает - person indexOutOfBounds; 01.08.2017
comment
хорошо, создайте еще один метод для абсолютного URL-адреса обзора, и он тоже будет работать - person Aniket Pawar; 01.08.2017

Вы должны указать значение аргументов URL-адреса. ваш шаблон должен выглядеть так

<a class="btn btn-primary btn-lg" href="{% url 'categories:user_review' slug='your_parameter' %}">Write A Review!</a>

.

person Mauricio Cortazar    schedule 01.08.2017