我正在尝试为某种类型的游戏创建多个配置。
更新:
class GameType(models.Model):
tag = model.CharField()
name = model.CharField()
class GameConfig(models.Model):
tag = model.CharField()
game_type = model.ForeignKey('GameType')
text_settings = model.ManyToManyField('GameTextSettings')
levels_settings = model.ManyToManyField('GameLevelSettings')
class GameTextSettings(models.Model):
tag = model.CharField()
texts = ArrayField(models.CharField(max_length=maxLengthText), default=list, blank=True)
class GameLevelSettings(models.Model):
tag = model.CharField()
duration = models.IntegerField()
如果在创建新配置时,我可以强制用户首先输入标签并选择类型,那就太好了。当他选择类型时,我想给他选择创建新的text_settings/level_settings或使用与同一类型的另一个game_configuration关联的text_settings/level_settings。
我认为我的数据库模型是错误的,但我对数据库几乎没有经验。我不想将游戏关卡设置或文本设置直接链接到游戏类型,因为它们应该只链接到游戏配置,但是我不知道在向用户呈现选择时如何实现这种"排序"。
你有什么建议?
谢谢
编辑2:我的斗争是创建将实现我的逻辑的视图。我不知道如何以这种方式链接视图,也不知道如何根据从同一表单中提取的值过滤模型选择字段选择。
额外信息:
场景:所以基本上我想允许用户为特定的游戏类型构建多个游戏配置。游戏配置具有一系列游戏关卡设置和单个文本设置。我想使每个单独的游戏关卡设置和文本设置可重用,以便当用户创建一个具有相同关卡但不同文本的新游戏配置时,他可以重用已经定义的游戏关卡设置。
我如何想象这应该工作
用户使用新的游戏配置创建表单打开页面 (duuh :D
(在此表单上,用户可以选择(或创建(游戏类型并为新的游戏配置输入标签
一旦用户选择了游戏类型,用户就会看到其他字段的选项(文本设置和游戏关卡设置数组(或能够创建新对象。这些字段的值已经过预过滤,因此仅显示与用于同一游戏类型的其他(以前创建的(游戏配置关联的对象。
具体场景:
我定义了 3 种游戏类型 - 蓝色、红色、绿色,并且已经为所有游戏类型创建了具有默认值的游戏配置。
现在我想为 GameType Blue 创建另一个游戏配置。
所以我打开创建视图和输入标签"深蓝色",然后从下拉列表中选择游戏类型"蓝色"。
一旦我选择了 GameType,其他字段中的所有值都会被过滤,以便它们只显示与以前的默认蓝色游戏配置关联的对象,而不显示与红色/绿色游戏配置关联的对象 - 这基本上是为了让用户更容易搞砸并使用红色文本配置蓝色游戏类型设置。
希望这有帮助。
干杯
django-smart-selects可以通过使用FK和渲染JQuery脚本来做到这一点,以便根据表单中的其他选择进行过滤。
从文档中:
如果您有以下型号:
class Continent(models.Model):
name = models.CharField(max_length=255)
class Country(models.Model):
continent = models.ForeignKey(Continent)
name = models.CharField(max_length=255)
class Location(models.Model):
continent = models.ForeignKey(Continent)
country = models.ForeignKey(Country)
area = models.ForeignKey(Area)
city = models.CharField(max_length=50)
street = models.CharField(max_length=100)
而且,如果您选择一个大陆,则只有位于该大陆上的国家/地区可用,并且对于区域也是如此,您可以执行以下操作:
from smart_selects.db_fields import ChainedForeignKey
class Location(models.Model)
continent = models.ForeignKey(Continent)
country = ChainedForeignKey(
Country,
chained_field="continent",
chained_model_field="continent",
show_all=False,
auto_choose=True
)
area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
city = models.CharField(max_length=50)
street = models.CharField(max_length=100)
如果您想从我不久前制作的页面中看到它的实际效果,请查看Thermaline的BeerCalc并从左侧的列中选择字段。
需要了解的一件事是,您可以使用现有模型上的智能选择中的form_fields来按 FK 选择进行筛选。在本例中,我有一个现有的模型产品类型,我的材质模型具有 FK。在我的尺寸表单中,当有人选择产品类型时,材料选择会相应地过滤。
from smart_selects.form_fields import ChainedModelChoiceField
# Arguments = ChainedModelChoiceField(app,model,to_field,modle_field,auto_select=False,show_all=False)
class SizingForm(forms.ModelForm):
material = ChainedModelChoiceField('tubes', 'Material', 'product_type', 'product_type', False, False)