Как я могу создать Django модель в views.py? - PullRequest
0 голосов
/ 01 мая 2020

На странице DetailView для объекта "Пациент" у меня есть форма. Когда форма заполнена и отправлена, я хочу создать объект «Местоположение». Затем я хочу создать ForeignKey, указывающий на объект «Пациент», на который мы смотрим в DetailView.

Как вы можете видеть, если форма верна, я вызываю конструктор модели, сохраняя информацию и подключите его к объекту пациента. Однако когда я проверяю Django Admin, я не вижу новый созданный объект. Я полностью импровизировал, так как не мог найти примеры в Интернете. Это способ сделать это?

class PatientDetailView(DetailView, FormMixin):
    model=Patient
    form_class = PastLocationForm
    #template_name = 'patient_detail.html'

    def get_success_url(self):
        return reverse('patient_detail', kwargs={'pk': self.object.pk})

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponseForbidden()
        self.object = self.get_object()

        form = self.get_form()

        if form.is_valid():
            pastLocationDetail = Location()
            setattr(pastLocationDetail,'location',str(form.cleaned_data['location']).split(',')[0])
            setattr(pastLocationDetail,'address',str(form.cleaned_data['location']).split(',')[1].split(', ')[0])
            setattr(pastLocationDetail,'district',str(form.cleaned_data['location']).split('District: ')[1].split(',')[0])
            setattr(pastLocationDetail,'grid_x',str(form.cleaned_data['location']).split('Coordinates: (')[1].split(', ')[0])
            setattr(pastLocationDetail,'grid_y',str(form.cleaned_data['location']).split('Coordinates: (')[1].split(', ')[1][:-1])
            setattr(pastLocationDetail,'date_from',form.cleaned_data['date_from'])
            setattr(pastLocationDetail,'date_to',form.cleaned_data['date_to'])
            setattr(pastLocationDetail,'details',form.cleaned_data['details'])
            setattr(pastLocationDetail,'patient', self.object)

            return self.form_valid(form)
        else:
            return self.form_invalid(form)

Модель местоположения

class Location(models.Model):
    patient = models.ForeignKey(Patient, related_name='locations', on_delete=models.CASCADE, null=True, blank=True)
.
.

Примечание: я распечатал оба объекта

print(type(self.object))
print(pastLocationDetail)

И все выглядит хорошо. Я действительно не понимаю, почему это не записывается в базу данных

1 Ответ

3 голосов
/ 01 мая 2020

Вы вызывали save метод? Django orm нужен вызов save для записи данных экземпляра в базу данных. См. Этот Django экземпляр модели документации .

if form.is_valid():
    pastLocationDetail = Location()
    ...
    pastLocationDetail.save()  # this line required for writing model instance to database 
    return self.form_valid(form)
else:
    return self.form_invalid(form)

Рекомендуется также просмотреть этот документ , чтобы лучше использовать форму.

...