我正在尝试向使用 Django 表单构建的表单下拉列表添加更多信息。该程序的基本解释是:
我不确定如何在下拉列表中显示除了名称之外是否为 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 %}
牌组名称/值对来自此行中生成的查询集:
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(即提交的值),并且您不会将更改保存回数据库,因此您的表单应该仍然可以正常工作,不会产生副作用