Проблема с организацией моделей и форм в 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())
Вернуться на верх