Django - Ошибка имени, когда представления вызывают метод модели - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в Джанго. Я определил модели и метод

from django.db import models
from django.contrib.auth.models import User

class Practice(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=200)
    phone = models.IntegerField()

    def __str__(self):
        return self.name

class Doctor(models.Model):
    specialisation = models.CharField(max_length=50)
    practice = models.ForeignKey(Practice, related_name='doctor',on_delete=models.DO_NOTHING)
    name = models.ForeignKey(User, related_name ='doctor', on_delete=models.DO_NOTHING)
    selected = models.BooleanField()


    def __str__(self):
        return self.specialisation

    def get_list_doctors(self):
        all_doctors = User.objects.exclude(pk=1).filter(doctor__isnull=False)
        all_doctors_names = all_doctors.values_list('last_name', 'first_name')
        return all_doctors_names

class Patient(models.Model):
    name = models.ForeignKey(User, related_name='patient', on_delete=models.DO_NOTHING)
    height = models.DecimalField(max_digits=6, decimal_places=2)
    weight = models.DecimalField(max_digits=6, decimal_places=2)
    practice = models.ForeignKey(Practice, related_name='patient',on_delete=models.DO_NOTHING)
    primary_doctor = models.ForeignKey(Doctor, related_name='patient',on_delete=models.DO_NOTHING)


class Appointment(models.Model):
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    doctor = models.ForeignKey(Doctor, related_name='appointment',on_delete=models.DO_NOTHING)
    practice = models.ForeignKey(Practice, related_name='appointment',on_delete=models.DO_NOTHING)
    patient = models.ForeignKey(Patient, related_name='appointment',on_delete=models.DO_NOTHING)

Это мой взгляд

def login_user(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            messages.success(request, ('You Have Been Logged In!'))

            doctor_list = get_list_doctors()
            context = { 'doctor_name': doctor_list}
            return render(request, 'homeunimed.html', context)

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

NameError at /
name 'get_list_doctors' is not defined
Request Method: POST
Request URL:    http://localhost:8000/
Django Version: 2.1
Exception Type: NameError
Exception Value:    
name 'get_list_doctors' is not defined
Exception Location: /Users/vinoojacob/Django/my_app/authenticate/views.py in login_user, line 27
Python Executable:  /Users/vinoojacob/Django/bin/python
Python Version: 3.6.5
Python Path:    
['/Users/vinoojacob/Django/my_app',
 '/Users/vinoojacob/Django/lib/python36.zip',
 '/Users/vinoojacob/Django/lib/python3.6',
 '/Users/vinoojacob/Django/lib/python3.6/lib-dynload',
 '/Users/Shared/anaconda3/lib/python3.6',
 '/Users/vinoojacob/Django/lib/python3.6/site-packages']

Однако я получаю эту ошибку. Любые указатели на то, что не так. Я думал, что вы можете получить доступ к любым методам, определенным в модели, если модель импортирована. Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Функция get_list_doctors(self) довольно бесполезна и исключает жесткое кодирование пользователем его ПК. Это очень плохо.

Пара предложений:

1) Изменить строку в докторе

 name = models.ForeignKey(User, related_name ='doctor', on_delete=models.DO_NOTHING)

С:

user = models. OneToOneField(User, related_name ='doctor', on_delete=models.CASCADE)

Отношение - это пользователь, и если пользователь ушел, вы также должны удалить Доктора. А также отношение один к одному!

2) Вы можете очень легко получить список врачей на ваш взгляд

def login_user(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            messages.success(request, ('You Have Been Logged In!'))
            doctors_list = Doctor.objects.exclude(user=user)
            context = { 'doctors_list': doctors_list}
            return render(request, 'homeunimed.html', context)

В вашем шаблоне вы можете получить доступ к имени доктора через пользователя (это очень наивный пример)

{% for doctor in doctors_list %}
     First name: {{ doctor.user.first_name }}
     Last name: {{ doctor.user.last_name }}
{% endfor %}
0 голосов
/ 16 сентября 2018

Как вы написали, вы можете получить к нему доступ через модель.Так что украсьте свой метод с помощью @staticmethod, оставьте self в качестве аргумента и назовите его так: doctor_list = Doctor.get_list_doctors().

@staticmethod
def get_list_doctors():
    all_doctors = User.objects.exclude(pk=1).filter(doctor__isnull=False)
    all_doctors_names = all_doctors.values_list('last_name', 'first_name')
    return all_doctors_names
...