На самом деле я работаю над студенческим проектом, в котором я пытаюсь создать игру в жанре roguelike в сети, используя Python Django.
Я смущаюсь своей проблемой, чтобы объяснить, что мне нужно нужно создать случайные характеристики в создании персонажа, на которые влияет выбранный класс персонажей.
Я хочу отправить эти характеристики пользователю, прежде чем он начнет игру. И используйте характеристики, которые я посылаю ему в своем form_valid (), чтобы сохранить символ в дБ.
Я знаю, что могу использовать get_context_data (), чтобы отправить некоторую информацию в мой шаблон, но я не знаю, могу ли используйте данные, отправленные get_context_data () в шаблон в форме form_valid ().
На самом деле мне удалось создать CreateView, чтобы сохранить символ со случайными характеристиками с помощью выбранного класса символов, см. код ниже.
models.py
class CharacterClass(models.Model):
name = models.CharField(max_length=20,
blank=True,
null=True)
minHpMax = models.PositiveIntegerField(default=10,
validators=[MinValueValidator(10)],
blank=False,
null=False)
minStrength = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minAgility = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minInt = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minPhysResis = models.IntegerField(default=0,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minMagRes = models.IntegerField(default=0,
validators=[MinValueValidator(0)],
blank=False,
null=False)
def __str__(self):
return f'{self.id}: {self.name}'
def generateHpMax(self):
return random.randint(self.minHpMax, self.minHpMax + 10)
def generateStrength(self):
return random.randint(self.minStrength, self.minStrength + 10)
def generateAgility(self):
return random.randint(self.minAgility, self.minAgility + 10)
def generateIntelligence(self):
return random.randint(self.minInt, self.minInt + 10)
def generatePR(self):
return random.randint(self.minPhysResis, self.minPhysResis + 10)
def generateMR(self):
return random.randint(self.minMagRes, self.minMagRes + 10)
class Character(models.Model):
name = models.CharField(max_length=20,
default='Jon Doe',
blank=False,
null=False)
characterClass = models.ForeignKey(CharacterClass,
on_delete=models.CASCADE,
related_name='characterClass')
level = models.PositiveIntegerField(default=1,
validators=[MinValueValidator(1)],
blank=False,
null=False)
hpMax = models.PositiveIntegerField(default=10,
validators=[MinValueValidator(0)],
blank=False,
null=False)
hp = models.PositiveIntegerField(default=10,
validators=[MinValueValidator(0)],
blank=False,
null=False)
strength = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
agility = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
intelligence = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
physicalResistance = models.IntegerField(default=0,
validators=[
MinValueValidator(0)],
blank=False,
null=False)
magicalResistance = models.IntegerField(default=0,
validators=[
MinValueValidator(0)],
blank=False,
null=False)
inventory = models.OneToOneField('Inventory',
on_delete=models.PROTECT)
def __str__(self):
return f'{self.id}: {self.name} ' \
f'[Lvl: {self.level}' \
f'|Class: {self.characterClass}' \
f'|HpM: {self.hpMax}' \
f'|hp: {self.hp}' \
f'|Str: {self.strength}' \
f'|Ag: {self.agility}' \
f'|Int: {self.intelligence}' \
f'|Pr: {self.physicalResistance}' \
f'|Mr: {self.magicalResistance}]'
def get_absolute_url(self):
return reverse('characterDetail', kwargs={'pk': self.pk})
views.py
class GenerateCharacterView(CreateView):
model = Character
form_class = CharacterForm
template_name = 'characterForm.html'
def form_valid(self, form):
# Creation of Character without db saving
self.object = form.save(commit=False)
# creation of empty inventory unique for the Character
inventory = Inventory()
inventory.save()
self.object.inventory = inventory
pkCharacterClass= form['characterClass'].value()
currentCharacterClass = get_object_or_404(CharacterClass,
pk=pkCharacterClass)
# for a CharacterClass found, get random characteristics for the Character in creation
generatedHpMax = currentCharacterClass.generateHpMax()
self.object.hpMax = generatedHpMax
self.object.hp = generatedHpMax
generatedStrength = currentCharacterClass.generateStrength()
self.object.strength = generatedStrength
generatedAgility = currentCharacterClass.generateAgility()
self.object.agility = generatedAgility
generatedIntelligence = currentCharacterClass.generateIntelligence()
self.object.intelligence = generatedIntelligence
generatedPhysicalResistance = currentCharacterClass.generatePR()
self.object.physicalResistance = generatedPhysicalResistance
generatedMagicalResistance = currentCharacterClass.generateMR()
self.object.magicalResistance = generatedMagicalResistance
# Enregistrement en BDD de l'objet et appel du super form valid pour
# renvoie de la succes url défini en Model
self.object.save()
return super().form_valid(form)
forms.py
class CharacterForm(forms.ModelForm):
class Meta:
model = Character
# exclude = []
fields = ['name', 'characterClass']
name = forms.CharField(max_length=20, widget=widgets.TextInput(
attrs={'placeholder': 'Enter Your Name'}
))
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', IndexView.as_view(), name='home'),
path('generateCharacter',
GenerateCharacterView.as_view(),
name='generateCharacter'),
path('characterDetail/<int:pk>', CharacterDetailView.as_view(),
name='characterDetail'),
]
Вам уже удалось использовать этот вид использования? Знаете ли вы, если это работает? и как ? У вас были какие-нибудь советы или рекомендации для меня? Я работаю над ним 2 дня и схожу с ума.
Здравствуйте, извините за этот билет, я могу ошибиться в том, что я показываю в нем.
На данный момент я использую код, который я показываю в заявке, для преодоления моей проблемы.
В данный момент я могу генерировать персонажа со случайными характеристиками, выбирая CharacterClass и имя персонажа.
Но что я хочу сделать, это генерировать случайные характеристики, когда я захожу на страницу формы.
Поэтому я пытаюсь поместить на страницу кнопку, которая вызывает путь «createCharacter / 1», где «1» - это pk of Мой класс персонажей.
И я попытался сгенерировать характеристики radom в этот момент, чтобы показать пользователю характеристики перед отправкой формы.
И в форме только спросил имя персонажа ,
Так что это был код, который я использовал ранее
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', IndexView.as_view(), name='home'),
path('createCharacter/<int:characterClass>',
CreateCharacterView.as_view(),
name='createCharacter'),
path('characterDetail/<int:pk>', CharacterDetailView.as_view(),
name='characterDetail'),
]
views.py
class CreateCharacterView(CreateView):
model = Character
form_class = CharacterForm
template_name = 'characterForm.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
classCharacter = get_object_or_404(CharacterClass ,self.kwargs['characterClass'])
context['randomCarac'] = classCharacter.getRadomCarac()
return context
def form_valid(self, form):
self.object = form.save(commit=False)
inventory = Inventory()
inventory.save()
self.object.inventory = inventory
self.object.characterClass= context['characterClass']
self.object.hpMax = context['hpMax ']
self.object.hp = context['hpMax ']
self.object.strength = context['strength ']
self.object.agility = context['agility ']
self.object.intelligence = context['intelligence ']
self.object.physicalResistance = context['physicalResistance ']
self.object.magicalResistance = context['magicalResistance ']
self.object.save()
return super().form_valid(form)
models.py
class CharacterClass(models.Model):
name = models.CharField(max_length=20,
blank=True,
null=True)
minHpMax = models.PositiveIntegerField(default=10,
validators=[MinValueValidator(10)],
blank=False,
null=False)
minStrength = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minAgility = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minInt = models.IntegerField(default=1,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minPhysResis = models.IntegerField(default=0,
validators=[MinValueValidator(0)],
blank=False,
null=False)
minMagRes = models.IntegerField(default=0,
validators=[MinValueValidator(0)],
blank=False,
null=False)
def __str__(self):
return f'{self.id}: {self.name}'
def generateHpMax(self):
return random.randint(self.minHpMax, self.minHpMax + 10)
def generateStrength(self):
return random.randint(self.minStrength, self.minStrength + 10)
def generateAgility(self):
return random.randint(self.minAgility, self.minAgility + 10)
def generateIntelligence(self):
return random.randint(self.minInt, self.minInt + 10)
def generatePR(self):
return random.randint(self.minPhysResis, self.minPhysResis + 10)
def generateMR(self):
return random.randint(self.minMagRes, self.minMagRes + 10)
def getRadomCarac(self):
return {'hpMax': self.generateHpMax(),
'strength': self.generateStrength(),
'agility': self.generateAgility(),
'intelligence': self.generateIntelligence(),
'physicalResistance': self.generatePR(),
'magicalResistance': self.getRadomCarac()}
Это не работает. Кажется, у меня нет доступа к моему контексту ['что-то'] в form_validation ()
Так что я также попытался
class CreateCharacterView(CreateView):
model = Character
form_class = CharacterForm
template_name = 'characterForm.html'
classCharacter = get_object_or_404(CharacterClass ,self.kwargs['characterClass'])
randomCarac = classCharacter.getRadomCarac()
def form_valid(self, form):
# Do things here with randomCarac['something']
иметь значение 'global' в Вид для использования, когда я хочу, get_object_or_404 () не работает