Лучший способ сохранить скрытые поля из CreateView, которые имеют ограничение unique_together? - PullRequest
0 голосов
/ 07 ноября 2019

Я нашел много вопросов и ответов по этой теме, но все они оставляют меня в замешательстве относительно того, что было бы лучшим способом справиться с этим, и кажется, что нужно рассмотреть много аспектов (например, я читал оФункция validate_unique () в ModelForm, но некоторые говорят, что было бы небезопасно передавать пользователя в форму)

Я хочу создать форму, которую пользователи могут использовать для регистрации на событие. Событие является производным от URL-адреса, пользователя от запроса. Следовательно, я на самом деле не нуждаюсь в форме. Тогда проблема заключается в том, чтобы провести проверку для Together_uniqueness, поскольку для каждого события может быть только одна регистрация.

В настоящее время мой код выглядит следующим образом:

models.py:

class Participant(models.Model):

    class Meta:
        constraints = [models.UniqueConstraint(fields=["user", "event"], name="user_unique_per_event")]

    user = models.ForeignKey(LocalUser, on_delete=models.PROTECT)
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    participating = models.BooleanField()

forms.py:

class EventRegistrationForm(forms.ModelForm):
    class Meta:
        model = Participant
        fields= ['participating']

views.py:

class EventRegistrationView(CreateView):
    template_name = 'events/event_registration.html'
    form_class = EventRegistrationForm
    queryset = Event.objects.all()

    def form_valid(self, form):
        form.instance.event = Event.objects.get(slug=self.kwargs['slug'])
        form.instance.user = self.request.user
  1. Какой лучший способ реализовать проверку на ограничение unique_together?
  2. Как лучше всего обработать ошибку, которая возникнет после этой проверки?

1 Ответ

0 голосов
/ 08 ноября 2019

Теперь я понял, как это работает. Может быть, это кому-нибудь поможет, поскольку я еще не нашел это точное решение в Интернете. Буду рад обратной связи;)

class EventRegistrationView(CreateView):
    template_name = 'events/event_registration.html'
    form_class = EventRegistrationForm
    queryset = Event.objects.all()

    def form_valid(self, form):
        form.instance.event = Event.objects.get(slug=self.kwargs['slug'])
        form.instance.user = self.request.user
        try:
            form.instance.validate_unique()
        except ValidationError as e:
            from django.forms.utils import ErrorList
            form.add_error(field=None, error=e)
            return super(EventRegistrationView, self).form_invalid(form)

        return super().form_valid(form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...