如何将 Django 模型中的信息公开到 forms/views(?)/html(?) 以便能够看到模型内置的所有信息

问题描述 投票:0回答:1

我正在尝试向使用 Django 表单构建的表单下拉列表添加更多信息。该程序的基本解释是:

  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',
    },

这是我的观点.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 %}
django django-models django-forms
1个回答
0
投票

牌组名称/值对来自此行中生成的查询集:

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(即提交的值),并且您不会将更改保存回数据库,因此您的表单应该仍然可以正常工作,不会产生副作用

© www.soinside.com 2019 - 2024. All rights reserved.