AttributeError: объект 'NoneType' не имеет атрибута 'aptTime' в Django

У меня есть модель записи на прием к врачу для пациента, я использовал пользовательскую модель пользователя для врача и пациента, используя is_staff и is_patient для их разграничения...

class Appointment(models.Model):
   
    doctor = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='staff',
                               on_delete=models.SET_NULL, null=True)
    patient = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+', on_delete=models.SET_NULL, null=True)
    aptTime = models.DateTimeField(blank=True, null=True)
    pending_approval = models.BooleanField(default=True, null=True)
    approved = models.BooleanField(default=False, null=True)

В моем views.py я пытаюсь установить пациента в request.user и врача в контекст, который я передал через url, поэтому у меня есть метод form_valid для создания записи на прием следующим образом...

class AppointmentCreateView(CreateView):
    model = Appointment
    fields = ['aptTime']
    template_name = 'patients/Appointment-Createview.html'
    

    def form_valid(self, form, *args, **kwargs):
        form.instance.doctor = self.kwargs['pk'] #TODO change to doctor instance
        form.instance.aptTime = self.object.aptTime
        form.instance.patient = self.request.user
        form.save()

я получил ошибку, говорящую ValueError: Cannot assign "1": "Appointment.doctor" must be a "User" instance. Internal Server Error: /patient/Appointment-Create/1/. После поиска в SO я смог изменить свой код на...

...Some code...

    def form_valid(self, form, *args, **kwargs):
        User = get_user_model()
        doc = User.objects.get(id=self.kwargs['pk'])
        form.instance.doctor = doc #TODO change to doctor instance
        form.instance.aptTime = self.object.aptTime
        form.instance.patient = self.request.user
        form.save()

   

теперь я получаю новую ошибку, говорящую

form.instance.aptTime = self.object.aptTime
AttributeError: 'NoneType' object has no attribute 'aptTime'

Я использую модель формы, я не понимаю, почему я получаю эту ошибку. Кто-нибудь, пожалуйста, помогите мне.

А CreateView не имеет self.object, ему всегда присваивается None. Вам не нужно обращаться к нему в любом случае, так как он уже присвоен объекту, обернутому в форму, так:

from django.contrib.auth.mixins import LoginRequiredMixin


class AppointmentCreateView(LoginRequiredMixin, CreateView):
    model = Appointment
    fields = ['aptTime']
    template_name = 'patients/Appointment-Createview.html'

    def form_valid(self, form):
        form.instance.doctor_id = self.kwargs['pk']
        form.instance.patient = self.request.user
        return super().form_valid(form)

Ваша Appointment модель, однако, кажется немного одним. Например, почему бы не работать с нулевым полем approved, которое является NULL/None, если оно еще не одобрено, True, если доктор одобрил, и False, если доктор отклонил, это, вероятно, лучше, поскольку в противном случае pending_approval может быть False, в то время как approved все еще может быть None, что приводит к состоянию, которое, по крайней мере, кажется нелогичным:

class Appointment(models.Model):
    doctor = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='appointments',
        on_delete=models.SET_NULL,
        null=True,
    )
    patient = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='+',
        on_delete=models.SET_NULL,
        null=True,
    )
    apt_time = models.DateTimeField()
    approved = models.BooleanField(default=None, null=True)

Note: You can limit views to a class-based view to authenticated users with the LoginRequiredMixin mixin [Django-doc].


Примечание: обычно имена полей в модели Django записываются в snake_case, а не PascalCase, поэтому должно быть: apt_time вместо aptTime.

Вернуться на верх