Использование Django ManyToManyField между двумя различными приложениями - PullRequest
0 голосов
/ 27 марта 2019

Допустим, у нас есть 2 приложения, игры и стримеры. Оба приложения получили свои собственные представления, модели, шаблоны и т. Д. В стримерах приложений мы получили модель Streamer

с полем

games = models.ManyToManyField ('games.Game')

и мы импортируем модель Game из приложений игры. Теперь после миграции, добавив некоторый контент, мы можем создать объект Streamer и назначить ему игры, в которые он играет. Но когда дело доходит до отображения всех игр, в которые играет выбранный Streamer, добавляя в шаблон тег

{{streamer.games}}

мы получаем строку шаблона

games.Game.None

так что что-то вызывает это, и мы пока не знаем, что именно. Мы создали представления для игр, стримеров, шаблонов, URL-адресов и все работает нормально, потому что мы получаем данные, такие как ник стримера или ссылки стримера на YouTube / Twitch и т. Д., Но если мы хотим, чтобы в нашем приложении стримерам разрешалось отображать игры, назначенные стримерам мы должны импортировать представления и модели из стримеров и игр? Или мы должны изменить в app streamers / views.py любое представление и разместить там игры, импортированные из приложений? Я знаю, как я мог бы сделать это в одном приложении с моделями и связями ManyToMany, потому что у меня уже был шанс (с помощью StackOverFlow) сделать что-то подобное. Но знайте, что я делаю проект (для обучения), и я решил лучше разделить отдельные приложения, и я не уверен, как это сделать. Если бы обе модели были в одном приложении, а представления были бы написаны, я мог бы просто использовать это как

    {% for game in streamer.games.all %}
    {{ games.title }}
    {% endfor %}

но вот эта проблема для меня, потому что это 2 разных приложения (я читал, что действительно лучше разделить их, как хорошая практика)

кос / models.py

from django.db import models
from games.models import Game, Genre
from shots.utils import get_unique_slug
from django.utils import timezone

...

# model for streamer
class Streamer(models.Model):
    nick = models.CharField(max_length=30)
    twitch = models.CharField(max_length=70)
    games = models.ManyToManyField('games.Game')
        ...

кос / views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Streamer
from django.utils import timezone
from django.contrib.auth.decorators import login_required
from .forms import StreamerForm

...

# defining page for single streamer
def streamer_detail(request, slug):
    streamer = get_object_or_404(Streamer, slug=slug)
    return render(request, 'streamers/streamer_detail.html', {'streamer': streamer})
...

кос / шаблоны / streamer_detail.html

{% block content %}
    <div class="post">
        {% if streamer.published_date %}
            <div class="date">
                {{ streamer.published_date }}
            </div>
        {% endif %}
        {% if user.is_authenticated %}
        <a href="{% url 'streamer_edit' slug=streamer.slug %}">Edit streamer</a>
        {% endif %}
        <h2>{{ streamer.nick }}</h2>
        <a href="https://{{streamer.youtube}}">My YouTube Channel</a>
        <a href="https://{{ streamer.twitch }}">My Twitch Channel</a>
        <p>I'm streaming on {{ streamer.platform }}</p>
        Games that I'm playing
        {{ streamer.games }}
    </div>
{% endblock %}

игры / models.py

from django.db import models
from django.utils import timezone
from shots.utils import get_unique_slug

# model for game
class Game(models.Model):
    title = models.CharField(max_length=70)
    genres = models.ManyToManyField('Genre', blank=True)
        ...
# model for genre
...

игры / views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Game
from django.utils import timezone
from django.contrib.auth.decorators import login_required
from .forms import GameForm

# defining page with newest games
...

# defining page for single games
def game_detail(request, slug):
    game = get_object_or_404(Game, slug=slug)
    return render(request, 'games/game.html', {'game': game})

...

1 Ответ

0 голосов
/ 27 марта 2019

Похоже, нам не нужно ничего импортировать из представлений 1 приложения в представления 2-го приложения.Для доступа к этим наборам запросов все, что нам нужно, это использовать правильный цикл, в моем случае это была 1 буква слишком много

game s .title

, поэтому, когда я его изменилк game.title все отлично работает

    {% for game in streamer.games.all %}
    {{ game.title }}
    {% endfor %}
...