Заполнение вариантов выбора из других объектов Модели
Небольшой вопрос, я не могу понять, как заставить это работать и мне нужна помощь.
Проблема Мне нужно иметь возможность запрашивать объекты другой модели, чтобы использовать их для выбора в другой модели. Я думал о внешнем ключе, но мне действительно не нужно, чтобы он расширял другую модель.
У меня есть группа под названием Group
, которая будет отображать варианты выбора из другой модели под названием Games
. Эти объекты уже будут сохранены в базе данных. Я просто не могу понять, как отобразить эти варианты.
Models.py для модели, в которой мы пытаемся отобразить выбор
game
- это поле, которое мы хотим выбрать из модели Games
from django.db.models.aggregates import Max
from games.models import Games
# Create your models here.
class Group(models.Model):
name = models.CharField(max_length=200)
game = models.ForeignKey(Games, on_delete=models.CASCADE)
size = models.IntegerField()
total_size = models.CharField(max_length=200)
play_time = models.DateTimeField()
description = models.TextField(max_length=200)
roles = models.CharField(max_length=200)
is_full = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
def __str__(self):
return self.name
Models.py из модели, из которой мы хотим сгенерировать варианты выбора.
Я хочу использовать поле name
из этой модели для выбора на поле Group
game
.
from django.db import models
from django.db.models.aggregates import Max
# Create your models here.
class Games(models.Model) :
GENRE_CHOICES = [
('Action', 'Action'),
('Acion-Adventure', 'Action-Adventure'),
('Adventure', 'Adventure'),
('MMO', 'MMO'),
('Puzzle', 'Puzzle'),
('Role Playing', 'Role Playing'),
('Simulation', 'Simulation'),
('Strategy', 'Strategy'),
('Sports', 'Sports')
]
RATING_CHOICES = [
('E', 'Everyone'),
('E10+', 'Everyone 10+'),
('T', 'Teen'),
('M', 'Mature 17+'),
('A', 'Adults Only 18+'),
('RP', 'Rating Pending')
]
PLATFORM_CHOICES = [
('Multi', 'Multi Platform'),
('PC', 'PC'),
('XBOX', 'XBOX'),
('Playstation', 'Playstation'),
('Nintendo', 'Nintendo')
]
name = models.CharField(max_length=200)
platform = models.CharField(max_length=20,
null=True,
choices=PLATFORM_CHOICES,
default='Select'
)
publisher = models.CharField(max_length=100)
genre = models.CharField(max_length=100,
null=True,
choices=GENRE_CHOICES,
default='Select'
)
rating = models.CharField(max_length=15,
null=True,
choices=RATING_CHOICES,
default='Select'
)
release_date = models.DateField()
tags = models.CharField(max_length=200)
picture = models.ImageField(
max_length=200,
default='games/default.png',
null=True,
upload_to='games/'
)
is_new = models.BooleanField(null=True)
is_popular = models.BooleanField(null=True)
is_featured = models.BooleanField(null=True)
def __str__(self):
return self.name
Итак, проблема была не в models.py, а в моем forms.py - я не определял ModelChoiceField для этого. Поэтому в моем Forms.py я добавил следующее:
class GroupForm(forms.ModelForm):
class Meta():
model = Group
fields = ['name', 'game', 'size', 'total_size', 'play_time',
'description', 'roles']
game = forms.ModelChoiceField(queryset=Games.objects.all())