Nabunon
Апрель 8, 2013 19:39:16
Доброго всем дня!
Изучаю Django около недели. Столкнулся с такой задачей:
имеются 2 класса:
class Player(models.Model):
…………
class Game(models.Model):
player = models.ManyToManyField(Player)
…………
Необходимо ещё до сохранения объекта (Game) проверить, чтобы в ней было как минимум 5 связей с объектами (Player). Если их нет, то не сохранять объект.
Как проще и эффективнее это организовать?
Я пробовал переписать save().
def save(self, *args, **kwargs):
if self.player.count() < 5:
return
…….
super(Game, self).save(*args, **kwargs)
Но такая модель (что и правильно) не работает, так как сам объект ещё в базе отсутствует, и связей ещё нет. Как быть?
P.S.: Админку не переписывал, а в пакетах джанго формы редактировать вообще дурной тон.
inoks
Апрель 8, 2013 21:52:27
А как данные будут вноситься в модель?
Nabunon
Апрель 8, 2013 22:19:17
Через форму административного интерфейса.
myarik
Апрель 9, 2013 06:57:13
С Django недавно, если не ошибаюсь то проверку можно организовать так:
def clean_player(self):
if self.player.count() < 5:
raise forms.ValidationError("Error")
else:
return self.cleaned_data['player']
inoks
Апрель 9, 2013 10:54:00
Нужно сделать свою форму для этой модели, в которой будет валидация и назначить эту форму модели:
admin.pyfrom django import forms
MIN_PLAYER_COUNT = 5
class GameForm(forms.ModelForm):
class Meta:
model =Game
def clean(self):
"""
Checks that we have at least MIN_PLAYER_COUNT player
"""
players= self.cleaned_data.get('player')
if len(players) < MIN_PLAYER_COUNT :
raise ValidationError("The game need at least %s player(s)" % MIN_PLAYER_COUNT)
return self.cleaned_data
class GameAdmin(admin.ModelAdmin):
form = GameForm
admin.register(Game, GameAdmin)
Nabunon
Апрель 9, 2013 14:17:43
inoks
Нужно сделать свою форму для этой модели, в которой будет валидация и назначить эту форму модели:admin.py
Сработало! Спасибо огромное!
Как-то упустил момент, что можно скорректировать форму в админке на свой лад. Уже думал писать свою со своими view и url. )
inoks
Апрель 9, 2013 20:55:15
>Сработало! Спасибо огромное!
плюсуем, не стесняемсяна здоровье