Как объединить различные модели с первичным ключом в Django?

Я очень новичок в Django. Я хочу сделать систему хранения данных пациентов, но застрял. Эти вещи должны быть в проекте. 1-) В моем проекте я хочу добавить сотни пациентов, а также некоторые новые пациенты могут добавлять свою информацию через регистрацию. 2-) Каждый пациент будет отвечать на более чем 300 вопросов, поэтому я хочу разделить модель для хорошего пользовательского опыта.

Вот моя проблема. Я разделил основные модели, затем я добавил некоторую основную информацию из hastaekle.html и затем, когда я посмотрел панель администратора. Я вижу эту страницу выбора на картинке ниже. Как это можно сделать автоматически.

enter image description here

Вот мой models.py

from django.db import models
from django.shortcuts import render
from django.urls import reverse

# Create your models here.




class HastaProfil(models.Model):
    #id = models.IntegerField(primary_key=True)
    hasta_ad = models.CharField(max_length=155)
    hasta_soyad = models.CharField(max_length=155)
    hasta_dogum_yeri = models.CharField(max_length=155)

    def __str__(self):
        return self.hasta_ad + ' ' + self.hasta_soyad

    def get_absolute_url(self):
        return reverse('hasta-aliskanlik')  


class HastaAliskanlik(models.Model):
    #id = models.IntegerField(primary_key=True)
    sigara = models.CharField(max_length=155)
    alkol = models.CharField(max_length=155)
    uyusturucu = models.CharField(max_length=155)          

    def __str__(self):
        return self.sigara

    def get_absolute_url(self):
        return reverse('hasta-listele')      
    

class Hasta(models.Model):
    #id = models.IntegerField(primary_key=True)
    hastaprofil = models.ForeignKey(HastaProfil, on_delete=models.CASCADE, null=True)  
    hastaaliskanlik = models.ForeignKey(HastaAliskanlik, on_delete=models.CASCADE, null=True) 

forms.py

from .models import  HastaAliskanlik, HastaProfil, Hasta
from django import forms

class HastaProfilForm(forms.ModelForm):
    class Meta: 
        model = HastaProfil
       
        fields = '__all__'

        widgets = {
           
            'hasta_ad' : forms.TextInput(attrs={'class': 'form-control'} ),
            'hasta_soyad' : forms.TextInput(attrs={'class': 'form-control'}), 
            'hasta_dogum_yeri' : forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Tıklayarak Seçiniz'}),
           


        
        }  


class HastaAliskanlikForm(forms.ModelForm):
    class Meta: 
        model = HastaAliskanlik
       
        fields = '__all__'

        widgets = {
           
            'sigara' : forms.TextInput(attrs={'class': 'form-control'} ),
            'alkol' : forms.TextInput(attrs={'class': 'form-control'}), 
            'uyusturucu' : forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Tıklayarak Seçiniz'}),
           


        
        }          



class HastaForm(forms.ModelForm):
    class Meta: 
        model = Hasta
       
        fields = '__all__'

        widgets = {
           
            'hastaprofil' : forms.TextInput(attrs={'class': 'form-control'} ),
            'hastaaliskanlik' : forms.TextInput(attrs={'class': 'form-control'}), 
            #'uyusturucu' : forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Tıklayarak Seçiniz'}),
           


        
        }   

  

views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import CreateView
from .forms import HastaProfilForm, HastaAliskanlikForm, HastaForm

from .models import HastaProfil, HastaAliskanlik, Hasta

# Create your views here.

class HastaProfil(CreateView):
    model = HastaProfil
    form_class = HastaProfilForm
    template_name = 'hastaekle.html'

class HastaAliskanlik(CreateView):
    model = HastaAliskanlik
    form_class = HastaAliskanlikForm
    template_name = 'hasta_aliskanlik.html'

 


def HastaListele(request):
    tum_hasta = Hasta.objects.all()
    return render(request, 'hasta_listele.html', {'tum_hasta': tum_hasta})    



def Home(request):
    return render(request, 'home.html')  

hastaekle.html

<html>
<head>
<title>Hasta Ekle </title>
</head>


<body>
    <a href="{% url 'home' %}"> Anasayfa </a><br>
    <a href="{% url 'hasta-listele' %}"> Hasta Listele </a>

<h1>Hasta Ekle </h1>

<form action="" method="POST">
{% csrf_token %}    
<h3>Hasta Profil Ekle:</h3> 
Hasta Ad: <input type="text" name="hasta_ad"/><br/>
Hasta Soyad: <input type="text" name="hasta_soyad"/><br/>
Hasta Doğum Yeri: <br/>
<textarea cols="35" rows="8" name="hasta_dogum_yeri">
</textarea><br/>
<input type="submit" value="Post"/>
</form>
</body>



</html>

hasta_aliskanlik.html

<html>
<head>
<title>Alışkanlıklarınız </title>
</head>


<body>
    <a href="{% url 'home' %}"> Anasayfa </a><br>
    <a href="{% url 'hasta-listele' %}"> Hasta Listele </a>

<h1>Hasta Ekle </h1>

<form action="" method="POST">
{% csrf_token %}    
<h3>Alışkanlıklarınız:</h3> 
Sigara: <input type="text" name="sigara"/><br/>
Alkol: <input type="text" name="alkol"/><br/>
Uyuşturucu: <br/>
<textarea cols="35" rows="8" name="uyusturucu">
</textarea><br/>
<input type="submit" value="Post"/>
</form>
</body>



</html>

hasta_listele.html

<h1>Hastalar</h1>

<a href="{% url 'home' %}"> Anasayfa </a><br>
    <a href="{% url 'hasta-ekle' %}"> Hasta Ekle </a>

<ul>
{% for post in tum_hasta %}

<li><a href="#">{{ post.hastaprofil.hasta_ad }} {{ post.hastaprofil.hasta_soyad }}</a> 

    
{% endfor %}
</ul>

Я думаю, что вы не можете сделать это таким образом, потому что проблема в том, что если несколько пользователей публикуют данные в одно и то же время в HastaProfil и HastaAliskanlik и, например, один пользователь публикует на HastaProfil, а другой на HastaAliskanlik, как вы теперь будете предоставлять эту информацию любому пользователю?

вам следует добавить на эти модели специальное поле, например user или связь между этими моделями, после чего вы сможете использовать доступ к данным простым способом

Вам необходимо использовать OneToOneField

class HastaAliskanlik(models.Model):
    hasta_profil = models.OneToOneField(
        HastaProfil,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    sigara = models.CharField(max_length=155)
    ...
Вернуться на верх