我刚开始学习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)