Django: Обновление значения контекста при каждом обновлении формы - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть UpdateView, который я использую для обновления некоторых данных из моей модели, но я хочу дать своему пользователю только максимальное количество раз, которое он может сделать, после того как он использовал все свои «обновления», он не долженбудет возможно больше. Мой взгляд выглядит следующим образом:

class TeamUpdate(UpdateView):
    model = Team
    template_name = 'team/team_update_form.html'
    context_object_name = 'team'
    form_class = TeamUpdateForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update({
            'max_updates': 2
        })
        return context

    def form_valid(self, form, **kwargs):
        team = form.save()
        // update context somehow so that it has the new value for max_updates?
        messages.success(self.request, f'{team} was updated')
        return redirect(team.get_absolute_url())

Моя проблема сейчас заключается в том, что я не знаю, как я могу динамически обновлять свой контекст каждый раз, когда обновляется моя форма. Как бы я это сделал? Я предполагаю, что жестко закодированный "2" должен быть удален, и я, вероятно, должен сделать что-то вроде 2 if not value_from_form else value_from_form, но как мне получить это value_from_form? И могу ли я использовать это значение в моей рассылке, чтобы проверить, равен ли он нулю, а затем перенаправить моего пользователя обратно с предупреждающим сообщением типа «Извините, вы израсходовали все свои обновления для этой команды!». Спасибо всем, кто ответит!

1 Ответ

1 голос
/ 06 ноября 2019

Я думаю, должно быть поле, в котором хранится количество максимальных обновлений в модели Team. Например:

class Team(models.Model):
   updated = models.IntegerField(default=0)

   def save(self, *args, **kwargs):
        if self.updated:
            self.updated += 1
        else:
            self.updated = 0
        super().save(*args, **kwargs)

Наконец, в settings.py есть переменная MAX_UPDATES_FOR_TEAM=2. Тогда в контексте вы можете просто вставить:

def get_context_data(self):
    context = super().get_context_data()
    updated = self.object.updated
    context.update({
            'max_updates': settings.MAX_UPDATES_FOR_TEAM - updated
    })
    return context

Наконец, запретите обновлять форму, если значение updated превышает MAX_UPDATES_FOR_TEAM

 class TeamForm(forms.ModelForm):
     ...
     def clean(self):
         if self.instance.updated >= settings.MAX_UPDATES_FOR_TEAM:
              raise ValidationError("Exceeded max update limit")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...