在django中创建对象时,如何将随机int分配给模型变量



我刚开始学习django,遇到了一个问题:

我写了一个英雄创造者。每个英雄都有一个名字、昵称、种族、职业和整数值,比如:strength, mana and HP

model.py:代码

class Hero(models.Model):
def statsRandomizer():
str_random = random.randint(1,20)
mana_random = random.randint(1,100)
HP_random = random.randint(1,30)
result = str_random
return result
RACES = {
("None", "None"),
("Human", "Human"),
("Elf", "Elf"),
("Dwarf", "Dwarf"),
("Ogre", "Ogre"),
("Hobbit", "Hobbit"),
("Gnome", "Gnome"),
}

user        = models.ForeignKey(User, default=1, null=True, on_delete=models.SET_NULL)
name        = models.CharField(max_length=30)
nickname    = models.CharField(max_length=30)
race        = models.CharField(default=0, choices=RACES, max_length = 30)
profession  = models.CharField(max_length=30)
#To do ogarnięcia bo nie działa.
slug        = models.SlugField(unique=True)
strength    = models.PositiveSmallIntegerField()
mana        = models.PositiveSmallIntegerField()
HP          = models.PositiveSmallIntegerField()
level       = models.PositiveSmallIntegerField(default = 0)

def get_absolute_url(self):
return f"/heroes/{self.slug}/"
def get_edit_url(self):
return f"/heroes/{self.slug}/edit/"
def get_delete_url(self):
return f"/heroes/{self.slug}/delete/"

正如你所看到的,我写了一个简单的方法来随机化值。它只返回strength进行测试。有什么问题?

如果我将代码更改为:

strength    = models.PositiveSmallIntegerField(default=statsRandomizer())
mana        = models.PositiveSmallIntegerField(default=statsRandomizer())
HP          = models.PositiveSmallIntegerField(default=statsRandomizer())

在形式上,我看到生成的数字,我可以创建英雄,但如果我刷新它并想创建第二个,我会得到相同的数字。当我在Atom中重新保存代码时,它们会发生更改。

预期结果是什么?我可以修复该功能,为每个新英雄生成不同的数字吗?

当然,我附上了我的表格:

from django import forms
from .models import Hero
import random
class HeroCreateForm(forms.Form):
name        = forms.CharField()
nickname    = forms.CharField()
race        = forms.CharField()
profession  = forms.CharField()
#To do ogarnięcia bo nie działa.
slug        = forms.SlugField()
strength    = forms.IntegerField()
mana        = forms.IntegerField()
HP          = forms.IntegerField()


class HeroCreateModelForm(forms.ModelForm):
class Meta:
model = Hero
fields = ['name', 'nickname', 'race', 'profession', 'strength', 'mana', 'HP' ]

def clean_name(self, *args, **kwargs):
instance = self.instance
name = self.cleaned_data.get('name')
qs = Hero.objects.filter(name__iexact=name) # iexact - lovercase/upper unique check
if instance is not None:
qs = qs.exclude(pk=instance.pk) #id = instance Pk = primary key
if qs.exists():
raise forms.ValidationError("This name is already exist! Please change it to unique one.")
return name

可以肯定的是,我对django还不够了解,那么我应该学习什么来更好地处理未来的问题呢?

strength    = models.PositiveSmallIntegerField(default=statsRandomizer())
mana        = models.PositiveSmallIntegerField(default=statsRandomizer())
HP          = models.PositiveSmallIntegerField(default=statsRandomizer())

函数状态随机化器在启动应用程序时运行

尝试不使用((

strength    = models.PositiveSmallIntegerField(default=statsRandomizer)
mana        = models.PositiveSmallIntegerField(default=statsRandomizer)
HP          = models.PositiveSmallIntegerField(default=statsRandomizer)

最新更新