mardi 12 novembre 2019

How to assign random int to model variable while creating object in django?

I just started learing a django and have a that problem:

I wrote a heroes creator. Each hero has a name, nickname, race, profession and the integers values like: strength, mana and HP.

Code of 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/"

As u can see, I wrote a simple method to randomize value. It's returning only strength for a test. What's a problem?

If I change my code to:

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

in form I see generated numbers, and I can create hero, but if I refresh it and want create second, I got same numbers. They are changed when I resave code in Atom.

And what is expected result? Can I repair that function to generate different numbers for each new hero?

For sure I attaching my forms:

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

It's more than sure that I haven't enough knowlage about django, so what should I learn to better handling with that problems in the future?




Aucun commentaire:

Enregistrer un commentaire