Есть ли способ вставить поле по умолчанию в модель 'wincon' каждого пользователя или заблокировать поле формы на значение, основанное на другом поле формы?
Я создаю игровой трекер. Я бы хотел, чтобы если пользователь выбирает что-то кроме "Win", то поле wincon в форме не изменялось или устанавливалось в поле по умолчанию. Это нужно для того, чтобы пользователю было проще понять, что если он не выиграл, то не должен добавлять wincon. Также было бы неплохо, если бы у пользователя было пустое поле, в которое, если он не хочет вводить wincon, по умолчанию вводилось бы '------'
В идеале, если это победа, то поле wincon можно будет изменить.
models.py
class Profile(models.Model):
user = models.ForeignKey(User,
max_length=10,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return str(self.user)
class Wincon(models.Model):
wincon = models.CharField(max_length=100,)
user = models.ForeignKey(User,
max_length=10,
on_delete=models.CASCADE,
null=True)
def __str__(self):
return self.wincon
class Game(models.Model):
# ForeignKeys
user = models.ForeignKey(User,
max_length=10,
on_delete=models.CASCADE,
null=True)
wincon = models.ForeignKey(Wincon,
on_delete=models.CASCADE,
null=True,
blank=True,)
views.py
@login_required(login_url='my-login')
def wincon(request):
wincon_list = Wincon.objects.filter(user=request.user)
user = User.objects.get(username=request.user)
if request.method == "POST":
wincon_form = WinconForm(request.POST)
if wincon_form.is_valid():
obj = wincon_form.save(commit=False)
obj.user = request.user
obj.save()
return HttpResponseRedirect('/wincon')
else:
wincon_form = WinconForm()
context = {'wincon_form': wincon_form, 'wincon_list': wincon_list, 'user': user}
return render(request, 'gametracker_app/wincon.html', context=context)
forms.py
class GameForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
super(GameForm, self).__init__(*args, **kwargs)
# Set wincon list shown to only wincon from user
user_wincon = Wincon.objects.filter(user=user)
user_wincon_list = []
for wincon in user_wincon:
user_wincon_list.append((wincon.id, wincon.wincon))
self.fields['wincon'].choices = user_wincon_list
class Meta:
model = Game
exclude = {'date', 'time', 'user'}
labels = {
'num_players': '# of Players',
'start_pos': 'Starting position',
'mull': 'Starting hand',
'outcome': 'Outcome',
'wincon': 'Your Wincon',
}
В своем файле forms.py я попытался добавить винкон по умолчанию, как показано ниже
class GameForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
super(GameForm, self).__init__(*args, **kwargs)
# Set wincon list shown to only wincon from user
user_wincon = Wincon.objects.filter(user=user)
user_wincon_list = [(0, '------')]
for wincon in user_wincon:
user_wincon_list.append((wincon.id, wincon.wincon))
self.fields['wincon'].choices = user_wincon_list
Но это только создает значение по умолчанию '------', и если оставить его выбранным, то форма выдает ошибку
"Выберите правильный выбор. Этот выбор не входит в число доступных вариантов."