Как передать информацию из модели Django в формы/views(?)/html(?), чтобы иметь возможность видеть всю информацию, встроенную в модель

Я пытаюсь добавить дополнительную информацию в выпадающую форму, построенную с помощью Django forms. Основное объяснение программы таково:

  1. Пользователь входит в систему
  2. Пользователь может создавать "колоды", которые будут отображаться на странице "game_tracking"
  3. Пользователь переходит на страницу 'game_tracking', и в первом выпадающем списке загружаются все названия колод, которые создал пользователь, а также дополнительная информация от модели 'Deck' о том, является ли она/не является колодой cEDH.

Я не знаю, как отобразить в выпадающем списке информацию о том, является ли колода is_cedh, помимо названия

Вот что сейчас отображается, когда я раскрываю выпадающий список

В идеале это то, что я пытаюсь сделать.

Заранее спасибо за то, что нашли время прочитать/ответить. Я работал над этим дольше, чем хотел бы признаться...

Это мой файл models.py.

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    profile_pic = models.ImageField(null=True,
                                blank=True,
                                default='Default.png',
                                upload_to='images/')

    user = models.ForeignKey(User,
                         max_length=10,
                         on_delete=models.CASCADE,
                         null=True)

    def __str__(self):
        return str(self.user)


class Deck(models.Model):
    deck = models.CharField(max_length=150)
    is_cedh = models.BooleanField(default=False)

    user = models.ForeignKey(User,
                         max_length=10,
                         on_delete=models.CASCADE,
                         null=True)

    def __str__(self):
        return str(self.deck)


class Game(models.Model):
    NUM_PLAYERS_CHOICE = [
        (2, 2),
        (3, 3),
        (4, 4),
        (5, 5),
        (6, 6)
        ]

    OUTCOME_CHOICE = [
        ('Win', 'Win'),
        ('Loss', 'Loss'),
        ('Draw', 'Draw'),
        ('Incomplete', 'Incomplete'),
        ]

    # ForeignKeys
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE, null=True)
    wincon = models.ForeignKey(Wincon, on_delete=models.CASCADE, null=True, blank=True)

    num_players = models.IntegerField(choices=NUM_PLAYERS_CHOICE, default=4)
    outcome = models.CharField(max_length=10, choices=OUTCOME_CHOICE, default='Win')

Вот мой файл forms.py

class GameForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(GameForm, self).__init__(*args, **kwargs)
        self.fields['deck'].queryset = Deck.objects.filter(user=user)

class Meta:
    model = Game
    exclude = {'date', 'time', }
    labels = {
        'deck': 'What deck',
        'num_players': '# of Players',
        'outcome': 'Outcome',
    },

Это мой views.py

@login_required(login_url='my-login')
def game_tracker(request):
    user_decks = Deck.objects.filter(user=request.user)

    if request.method == "POST":
        form = GameForm(request.user, request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/')
    else:
        form = GameForm(request.user)

    context = {'form': form, }
    return render(request, 'gametracker_app/gametracker.html', context=context)

А это мой HTML.

{% block content %}
    <form action=""
          method="POST">
      {% csrf_token %}
      <div class="container-sm p-4">
        <div class="card"
             style="">
          <div class="card-body">
            {{ form.deck|as_crispy_field }}
            <br>
            <a href="{% url 'my-decks' %}"
               class="">
              <p class="">Add new deck?</p>
            </a>
            <div class="flex-container">
              <div class="row">
                <div class="col-sm">
                  {{ form.num_players|as_crispy_field }}
                </div>
                <div class="col-sm">
                  {{ form.outcome|as_crispy_field }}
                </div>
              </div>
            </div>
            
            <button type='submit'
                    class="btn btn-secondary">Submit
            </button>
          </div>
        </div>
      </div>
    </form>
{% endblock %}

Пары имя/значение колоды поступают из набора запросов, сгенерированного в этой строке:

self.fields['deck'].queryset = Deck.objects.filter(user=user)

Вы можете перехватить эти значения и добавить то, что вам нужно

user_decks = = Deck.objects.filter(user=user)
for deck in user_decks:
    if deck.is_cedh:
         deck.deck += ":isCEDH"
self.fields['deck'].queryset = user_decks

Поскольку это не затрагивает ID, который является переданным значением, и вы не сохраняете изменения в базе данных, ваша форма должна работать без побочных эффектов

Вернуться на верх