Django RelatedObjectDoesNotExist при очистке формы и доступе к self.instance.user - PullRequest
0 голосов
/ 03 ноября 2018

Я не могу понять, почему при попытке доступа к self.instance.user при переопределении метода очистки моей формы я получаю RelatedObjectDoesNotExist. Это происходит не каждый раз и кажется почти случайным, поэтому это доставляет мне много хлопот. Смотрите ниже мою форму и модель

forms.py

class UserSurveyQueueForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super().__init__(*args, **kwargs)
        self.fields['queue'].queryset = Employees.objects.all()
        self.fields['queue'].required = False

    def clean(self):
        cleaned_data = self.cleaned_data
        users_added = cleaned_data.get('queue')
        if users_added:
            for user in users_added:
                if user == self.instance.user:
                    raise forms.ValidationError("Yikes, you can't add {} to {}'s queue!".format(
                        self.instance.user.employee.first_name, self.instance.user.employee.first_name
                    ))

                last_created = UserNPS.objects.filter(user=user.employee, reporter=self.instance.user.employee).values(
                'created_at').last()
                if last_created:
                    timedelta = (timezone.now() - last_created['created_at']).days
                    if timedelta <= settings.DAYS_BETWEEN_SURVEYS:
                        raise forms.ValidationError("You have recently filled out a survey for {} {}, please wait {} days before doing so again!".format(
                            user.employee.first_name, user.employee.last_name, settings.DAYS_BETWEEN_SURVEYS - timedelta))


    class Meta:
        model = UserSurveyQueue
        fields = ('queue',)
        widgets = {
            'queue': autocomplete.ModelSelect2Multiple(
                url='user-autocomplete',
                attrs={
                    'data-placeholder': 'Search by name, username, email, department, office, or team',
                }
            ),
        }

models.py

class UserSurveyQueue(models.Model):
    user = models.OneToOneField(
        Employees,
        on_delete=models.CASCADE
    )
    queue = models.ManyToManyField(
        Employees,
        blank=True,
        related_name='survey_queue',
    )

    class Meta:
        verbose_name = ('Survey Queue')
        verbose_name_plural = ('Survey Queues')

    def current_queue(self):
        return ", ".join([str(q.employee.username) for q in self.queue.all()])

    def __str__(self):
        return self.user.employee.username

Ошибка:

File "forms.py" in clean
  62.                 if user == self.instance.user:

File "lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py" in __get__
  175.                 "%s has no %s." % (self.field.model.__name__, self.field.name)
django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist: UserSurveyQueue has no user.

1 Ответ

0 голосов
/ 03 ноября 2018

Эта ошибка возникает при создании объекта, но не при его обновлении. При его создании не следует использовать self.instance.user, потому что он еще не существует.

Вы должны также связать пользователя с формой при ее вводе в __init__. Вы должны написать self.user = kwargs.pop('user') и затем получить к нему доступ с помощью self.user в классе UserSurveyQueueForm.

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