NoReverseMatch в Django 2 - PullRequest
       2

NoReverseMatch в Django 2

0 голосов
/ 28 января 2020

Я немного новичок в этом, и я думаю, что я неправильно понял некоторые вещи, поэтому я попытаюсь описать это как можно лучше.

У меня есть 3 таблицы (модели), Игра, Глава, Поток , Глава и Тема связаны с игровым столом.

models.py

class Game(models.Model):
    title = models.CharField(max_length=100)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

class Chapter(models.Model):
    title = models.CharField(max_length=80)
    content = models.CharField(max_length=10000, null=True)
    game = models.ForeignKey(Game, on_delete=models.CASCADE)

    def __str__(self):
        return self.chapter

class Thread(models.Model):
    title = models.CharField(max_length=100)
    content = models.CharField(max_length=1000, null=True)
    game = models.ForeignKey(Game, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

views.py

def chapter(request, game_id):
    auth = top_menu = True
    chapters = Chapter.objects.filter(game=game_id)
    return render(request, 'chapters.html', {"chapters": chapters, "auth": auth, "top_menu": top_menu})

def thread(request, game_id):
    auth = top_menu =True
    threads = Thread.objects.filter(game=game_id)
    return render(request, 'threads.html', {"auth": auth, "threads": threads, "top_menu": top_menu})

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index, name="index"),
    path('signup/', signup, name="signup"),
    path('logout/', logout_view, name="logout"),
    path('login/', login_view, name="login"),
    path('<int:game_id>/chapters/', chapter, name="chapter"),
    path('<int:game_id>/threads/', thread, name="thread"),
]

index. html

{% extends 'base.html' %}

{% block content %}
    <div class="container">
        <div class="wrapper">
            <div class="row">
                <div class="col-lg-12 text-center" style="margin-bottom:80px;">
                    <h1>Welcome to Solo Rpg Helper</h1>
                </div>
            </div>
            {% if auth %}
            <div class="row">
                <div class="col-lg-12 text-center">
                    <h1>Your games:</h1>
                    <ul class="list-group list-group-flush">
                        {% for game in games.all %}
                            <a href="{% url 'chapter' game.id %}"><li class="list-group-item">{{ game.title }}</li></a>
                        {% endfor %}
                    </ul>
                </div>
            </div>
            {% else %}
            <div class="row">
                <div class="col-lg-12 text-center sign-buttons">
                    <h3><a href="{% url 'login' %}" class="btn btn-lg btn-success">Sign in</a> <a href="{% url 'signup' %}" class="btn btn-lg btn-danger">Sign up</a></h3>
                </div>
            </div>
            {% endif %}
        </div>
    </div>
{% endblock %}

chapter. html

{% extends 'base.html' %}

{% block top_menu %}
    <li><a href="{% url 'index' %}">Games</a></li>
    <li><a href="{% url 'chapter' 1 %}">Chapters</a></li>
    <li><a href="{% url 'thread' 1 %}">Threads</a></li>
{% endblock %}
{% block content %}
    <div class="container">
        <div class="wrapper">
            {% for chapter in chapters.all %}
                <div class="row">
                    <div class="col-lg-6">
                        <h1>{{ chapter.title }}</h1>
                    </div>
                    <div class="col-lg-6">
                        <p>{{ chapter.content }}</p>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
{% endblock %}

index. html отлично работает, потому что я oop игр, так что я могу получить доступ к game.id.

В chapter. html Я хочу снова использовать game.id, но я не уверен, как получить к нему доступ, хотя он передан в главе функций в views.py (я вижу это в терминале).

Если я использую это так:

<li><a href="{% url 'chapter' 1 %}">Chapters</a></li>

, это работает, но если я использую game.id, как в index. html :

<li><a href="{% url 'chapter' game.id %}">Chapters</a></li>

Я получаю сообщение об ошибке:

Error:

Извините за длинный пост.

1 Ответ

2 голосов
/ 28 января 2020
def chapter(request, game_id):
    auth = top_menu = True
    chapters = Chapter.objects.filter(game=game_id)
    return render(request, 'chapters.html', {"chapters": chapters, "auth": auth, "top_menu": top_menu})

В настоящее время вы не можете использовать game.id в шаблоне chapters.html, потому что представление не включает game в контекстном словаре.

Типичным подходом является используйте get_object_or_404, чтобы обработать случай, когда ни одна игра не соответствует game_id.

from django.shortcuts import get_object_or_404

def chapter(request, game_id):
    auth = top_menu = True
    game = get_object_or_404(Game, pk=game_id)
    chapters = Chapter.objects.filter(game=game_id)
    return render(request, 'chapters.html', {"chapters": chapters, "auth": auth, "top_menu": top_menu, "game": game})
...