在Django中创建对象时,如何将随机int赋值给模型变量?

2024-06-28 15:17:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学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的了解还不够,那么我应该学些什么来更好地处理这些问题呢


Tags: instancenameselfdefaultreturnmodelsdefforms
1条回答
网友
1楼 · 发布于 2024-06-28 15:17:52
strength    = models.PositiveSmallIntegerField(default=statsRandomizer())
mana        = models.PositiveSmallIntegerField(default=statsRandomizer())
HP          = models.PositiveSmallIntegerField(default=statsRandomizer())

函数statsRandomizer在启动应用程序时运行

不带()

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

相关问题 更多 >