Проблема с организацией моделей и форм в Django
Мне нужен хороший совет, как я могу создать регистрационную форму из этих двух моделей:
class Adress(models.Model):
"""
Abstract model for users and organizations adresses
"""
country = models.CharField(max_length=50)
city = models.CharField(max_length=50)
street = models.CharField(max_length=50)
house_number = models.IntegerField()
postal_code = models.CharField(max_length=50)
class Meta:
verbose_name = "Adress"
verbose_name_plural = "Adresses"
And Patient model:
class Patient(DiaScreenUser):
"""
Choices for diabet type options
"""
FIRST_TYPE = '1'
SECOND_TYPE = '2'
NULL_TYPE = 'null'
DIABETES_TYPE_CHOICES = (
(FIRST_TYPE, '1 тип'),
(SECOND_TYPE, '2 тип'),
(NULL_TYPE, 'відсутній'),
)
height = models.DecimalField(max_digits=6, decimal_places=2)
weight = models.DecimalField(max_digits=6, decimal_places=2)
body_mass_index = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
connect_to_doctor_date = models.DateTimeField(blank=True)
diabet_type = models.CharField(max_length=10, choices=DIABETES_TYPE_CHOICES, default=NULL_TYPE)
is_oninsuline = models.BooleanField(db_index=True)
doctor_id = models.ForeignKey(Doctor, on_delete=models.SET_NULL, blank=True, null=True)
adress_id = models.ForeignKey(Adress, on_delete=models.SET_NULL, blank=True, db_index=True, null=True)
Мне нужна регистрационная форма, в которой пациент мог бы вводить свою личную информацию и информацию об адресе (НО я не могу понять, как это работает, когда у меня есть внешний ключ в моей модели пациента). Спасибо за любые советы!
Я пытался создать нечто подобное, но в данном случае я не могу понять, как связать адрес с пациентом
class AdressForm(ModelForm):
class Meta:
model = Adress
fields = ["country","city"]
class PatientForm(ModelForm):
adress_form = AdressForm()
class Meta:
model = Patient
fields = [
"username",
"email",
"phone_number",
]
Вот некоторые рекомендации по использованию представления на основе классов. Общая идея такова: создайте форму для Patient, с некоторыми дополнительными полями, соответствующими Adress, затем создайте оба объекта из этой формы в представлении.
1. Форма
Дополните PatientForm, указав больше полей формы. Вам нужно одно поле формы на необходимое поле модели Adress. Вы можете указать такие вещи, как, например, требуется ли поле для отправки формы, какой длины должна быть строка... Проверьте документацию
from django import forms
from ..models import Patient
class PatientForm(forms.ModelForm) :
class Meta:
model = Patient
fields = [
"username",
"email",
"phone_number",
# any other field you need from Patient model
]
# then add the fields you need to create Adress model
country = forms.CharField(label="Country", required=False)
city = forms.CharField(label="City", required=False)
street = forms.CharField(max_length=50)
house_number = forms.IntegerField()
postal_code = forms.CharField()
2. Вид
Ваша форма сопряжена с представлением, в котором вы можете выполнить работу по созданию адреса, сохранению его в БД, а затем использовать его для создания пациента :
from django.shortcuts import redirect
from django.urls import reverse_lazy
from django.views.generic import CreateView
from ..forms import PatientForm
from ..models import Patient, Adress
class PatientFormView(CreateView):
model = Patient
form_class = PatientForm
success_url = reverse_lazy("home")
def form_valid(self, form):
adress = Adress(
country = form.cleaned_data["country"],
city = form.cleaned_data["city"],
street = form.cleaned_data["street"],
house_number = form.cleaned_data["house_number"],
postal_code = form.cleaned_data["postal_code"]
)
adress.save()
self.object = Patient(
username = form.cleaned_data["username"],
email = form.cleaned_data["email"],
phone_number = form.cleaned_data["phone_number"]
...
adress = adress
)
self.object.save()
return redirect(self.get_success_url())