Как передать информацию из модели Django в формы/views(?)/html(?), чтобы иметь возможность видеть всю информацию, встроенную в модель
Я пытаюсь добавить дополнительную информацию в выпадающую форму, построенную с помощью Django forms. Основное объяснение программы таково:
- Пользователь входит в систему
- Пользователь может создавать "колоды", которые будут отображаться на странице "game_tracking"
- Пользователь переходит на страницу '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, который является переданным значением, и вы не сохраняете изменения в базе данных, ваша форма должна работать без побочных эффектов