Django: ManyToManyField отображается как пустой в моем шаблоне - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблема с отображением ManyToManyField в шаблоне профиля персонажа с использованием Django.

В шаблоне должен отображаться аватар, а также некоторая информация о персонаже, включая список гильдий этого персонажа. присоединился Но когда я пытаюсь отобразить этот список, он кажется пустым. Я заглянул на страницу администрирования своего сайта, и эта информация там есть, поэтому у меня есть подтверждение, что данные могут отображаться в моем шаблоне. Я просто не знаю как. Как я могу справиться с этим?

Это мои модели:

""" Modelos de la aplicación de personajes """
from django.db import models

class Guild(models.Model):
    """ Modelo del clan """
    guild_name = models.CharField(max_length=25)
    rank = models.PositiveSmallIntegerField()

    def __str__(self):
        return self.guild_name

class Character(models.Model):
    """ Modelo del personaje """
    character_name = models.CharField(max_length=25)
    level = models.PositiveSmallIntegerField()
    race = models.CharField(max_length=25)
    gender = models.CharField(max_length=25)
    job = models.CharField(max_length=25)
    avatar = models.ImageField(upload_to='', blank=True)
    character_guilds = models.ManyToManyField(Guild, blank=True)

    def __str__(self):
        return self.character_name+': '+self.race+' '+self.job+' level '+str(self.level)+'. '

Мой файл view.py:

def characterprofile(request, pk):
    """ Método para mostrar el perfil de un personaje """
    template = '../templates/character/characterProfile.html'
    profile = Character.objects.get(pk=pk)
    guilds = profile.character_guilds.all()
    context = {
        'profile': profile,
        'guilds': guilds
    }
    return render (request, template, context)

И мой шаблон. html:

{% extends 'base.html' %}

{% block content %}
    <header>
        <h2>{{ profile.character_name }}'s profile</h2>
    </header>
    <nav class="nav nav-pills nav-justified">
        <a class="nav-item nav-link" href="{% url 'characters' %}">Return</a>
    </nav>
    <br>
    <div class="container">
        <div class="container">
            {% if profile.avatar %}
            <img class="rounded" src="{{ profile.avatar.url }}" width="184" height="184">
            {% else %}
            <p>There is no avatar to display here.</p>
            {% endif %}
        </div>
        <br>
        <h4>Information</h4>
        <ul class="list-group list-group-flush-sm">
            <li class="list-group-item">Name: {{ profile.character_name }}</li>
            <li class="list-group-item">Level: {{ profile.level }}</li>
            <li class="list-group-item">Race: {{ profile.race }}</li>
            <li class="list-group-item">Gender: {{ profile.gender }}</li>
            <li class="list-group-item">Job: {{ profile.job }}</li>
            <li class="list-group-item">
                Guilds: 
                {% for g in guilds %} 
                    {{ g }} 
                {%endfor%}
            </li>
        </ul>
        <br>
    </div>
    <br>
    <footer>
        <span>Copyright© 2020</span>
    </footer>
{% endblock %}

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Мне наконец удалось заставить это работать. Был другой взгляд, вызывающий конфликты. form.save(commit=False) может вызвать проблемы с отношениями MtM, поэтому я изменил его на True.

0 голосов
/ 19 февраля 2020

Я думаю, что проблема с вашим primary key, потому что с базой данных, когда строка удаляется и вы воссоздаете новую, первичный ключ не перезапускается с 1.

Например, попробуйте что-то подобное в Ваша функция просмотра:

profile = Character.objects.get(character_name=character_name)

надеюсь, это поможет

...