Есть ли способ передать определенную информацию, специфичную для пользователя, в поля (новой) формы django?
У меня следующая "проблема": Я автоматизировал "игру с предсказаниями", где пользователи могут выиграть очки, когда они правильно предсказывают победителей в спортивном событии в течение нескольких недель (например: Тур де Франс). Им разрешается выбрать 5 спортсменов, которые, по их мнению, победят в гонках. В конце каждой недели пользователям разрешается внести некоторые изменения в свой прогноз на следующую неделю.
До определенной даты (начало соревнований или недели) пользователи могут выбрать спортсменов для своего прогноза. Пользователи могут заполнить форму, и если они передумают до старта, они все еще могут изменить/обновить свой прогноз. Но после старта они уже не смогут его изменить, и их данные будут использованы для подсчета очков. После первой недели (в течение которой их баллы будут рассчитываться на основе данных, внесенных ими в модель "PredictionWeek1"), у них будет возможность сделать новый прогноз на следующую неделю (модель "PredictionWeek2"), который они также смогут обновлять сколько угодно до определенной даты.
В действительности, ввод данных для второй недели будет очень похож на ввод данных для первой недели: пользователи, вероятно, захотят изменить только одного или двух спортсменов. Поэтому, и это вопрос, будет лучше, если форма ввода "PredictionWeek2" уже будет заполнена их прогнозами на первую неделю, чтобы им не пришлось выбирать каждого спортсмена снова.
Я уже пытался искать способ, чтобы их входные данные из "PredictionWeek1" передавались в аргумент "по умолчанию" для 'charfield' в моделях, но безуспешно: у меня не получается сделать его специфичным для пользователя... Я также пытался сделать что-то похожее на "UpdateView", но и это не помогло: вход для PredictionWeek2 не может быть "обновлением" для PredictionWeek1: подсчет очков на первой неделе должен производиться с входом PredictionWeek1, а подсчет очков на второй неделе - с входом PredictionWeek2, так что это всегда должен быть отдельный вход)
Ниже приведен используемый код (немного упрощенный для лучшего понимания):
В views.py:
class PredictionWeek1CreateView(LoginRequiredMixin, CreateView):
model = PredictionWeek1
fields = ['prediction1', 'prediction2', 'prediction3', 'prediction4', 'prediction5']
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
class TourPronoWeek1UpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = PredictionWeek1
template_name = 'folder/prediction1_update.html'
fields = ['prediction1', 'prediction2', 'prediction3', 'prediction4', 'prediction5']
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def test_func(self):
prediction = self.get_object()
if self.request.user == prediction.user:
return True
return False
class PredictionWeek2CreateView(LoginRequiredMixin, CreateView):
model = PredictionWeek2
fields = ['prediction1', 'prediction2', 'prediction3', 'prediction4', 'prediction5']
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
class PredictionWeek2UpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = PredictionWeek2
template_name = 'folder/predictionweek2_update.html'
fields = ['prediction1', 'prediction2', 'prediction3', 'prediction4', 'prediction5']
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def test_func(self):
prediction = self.get_object()
if self.request.user == prediction.user:
return True
return False
в models.py:
#FYI: "startlist" - это список спортсменов, которые участвуют в соревнованиях и из которых пользователи могут выбирать
class PredictionWeek1(models.Model):
prediction1 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction2 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction3 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction4 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction5 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def clean(self):
prediction = [self.prediction1, self.prediction2, self.prediction3, self.prediction4, self.prediction5]
if len(prediction) != len(set(prediction)):
raise ValidationError('Error, you have chosen the same athlete two times!')
def __str__(self):
return str(self.user)
def get_absolute_url(self):
return reverse('MyPrediction')
class PredictionWeek2(models.Model):
prediction1 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction2 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction3 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction4 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
prediction5 = models.CharField(verbose_name = False, max_length=100, choices = startlist)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def clean(self):
prediction = [self.prediction1, self.prediction2, self.prediction3, self.prediction4, self.prediction5]
if len(prediction) != len(set(prediction)):
raise ValidationError('Error, you have chosen the same athlete two times!')
def __str__(self):
return str(self.user)
def get_absolute_url(self):
return reverse('MyPrediction')
Заранее спасибо!